3D -Blockkamera
BlockCam ist ein Kameraprogramm für iOS und iPados, das Bilder über Avfoundation aufnimmt und diese Bilder dann in einfache 3D -Szenen umwandelt. Die Szenen können vom Benutzer gedreht und skaliert werden und als flaches Bild gespeichert werden.
Blockcam wurde von Stuart Rankin geschrieben.
Die Versionierung für Blockcam wird in der Versioning.swift Datei verwaltet und automatisch mit jedem Build als Schritt vor dem Bau aktualisiert. Die Aktualisierung umfasst Build -IDs, Buildnummern, Zeiten und Daten, aber die Versionsnummern müssen derzeit von Hand aktualisiert werden. Die aktuelle Bauzeichenfolge unten wird auch durch denselben Mechanismus aufrechterhalten.
Das Versioning -Programm aktualisiert derzeit die Versionsnummern der BlockCam -Projektdatei nicht.
Letztes Build: Version 0.9 Alpha, Build 3287, Build Datum: 13. Juli 2021, 16:06
Informationen zu den aktualisierten Versionen und Builds finden Sie unter VersionUpdater Repository auf GitHub.
BlockCam ist so konzipiert, dass sie benutzerversorgte Informationen so weit wie möglich enthalten. Blockcam wird immer explizit darum, wenn benutzerdefinierbare Informationen verwendet werden. Blockcam sammelt von Blockcam standardmäßig keine benutzerdefinierbaren Informationen. Der Benutzer muss aktive Schritte ausführen, um die Sammlung dieser Art von Informationen zu ermöglichen.
| Identifizierbare Informationen | Verwenden | Lagerung |
|---|---|---|
| Benutzername | Der Name des Benutzers (vom Benutzer eingegeben) wird in verarbeiteten Bildmetadaten gespeichert. | Gespeichert in UserDefaults . |
| User Copyright | Die Copyright -Zeichenfolge des Benutzers (vom Benutzer eingegeben) wird in verarbeiteten Bildmetadaten gespeichert. | Gespeichert in UserDefaults . |
Wenn der Benutzer Blockcam instanziiert, wird er im Live -Ansichtsmodus geöffnet (zeigt die Ansicht der Kamera auf dem Hauptbildschirm an). Der Benutzer hat die Möglichkeit, einen von drei Modi auszuwählen:
Blockcam wurde auf den folgenden Plattformen getestet:
UIBezierPath , um weitere Formen hinzuzufügen.Blockcam gibt es vier Leistungsbedenken:
autoreleasepool Blöcken wurden die meisten Bedenken berücksichtigt. Wenn sich herausstellt, dass dies nicht ausreicht, besteht ein Minderungsplan: Speichern Sie alle Kratzbilder auf dem lokalen Speicher und lesen Sie sie einzeln und verarbeiten Sie sie einzeln. Dies wird die Dinge verlangsamen, aber den Speicherdruck verringern. Blockcam konvertiert jedes Bild, das über CoreImage -Filter CIPixellate in ein pixelliertes Bild aufgenommen wird. Nach der Pixellation berechnet der Verarbeitungsalgorithmus dann die Höhe der Höhe - die Höhe bestimmt entweder die Größe eines Knotens oder die Extrusion eines Knotens. Anschließend wird jedes Pixel aus dem pixellierten Bild in eine 3D -Form (vom Benutzer festgelegt) konvertiert und dann der aktuellen Szene in der 3D -Ansicht hinzugefügt.
Alle Verarbeitungsvorgänge verwenden denselben Code, können jedoch je nach im Wirkungsmodus benutzergerichteter Modus unterschiedlich (oder mehrfach) bezeichnet werden.
Für die Verarbeitung wird ein Bild erfasst. Die Bildquelle ist nicht wichtig, solange es sich um ein Standard, ein iOS/iPados-lesbarer Bild handelt. Die häufigste Bildquelle wird höchstwahrscheinlich die Live -View -Kamera sein. Andere Quellen sind das Fotoalbum und Videorahmen.
Das folgende Bild ist die Quelle für die Verarbeitung. (Dies ist ein Bild, das ich im frühen Winter von unserem Garten gemacht habe.)

Angesichts der Leistungsaufwand für die Konvertierung des Bildes hat der Benutzer die Möglichkeit, die Arbeit zu reduzieren, indem das Quellbild auf eine kleinere Größe geändert wird. Dies kann auch ohne die Intervention des Benutzers geschehen, wenn Videos verarbeitet werden sollten. (Die Verarbeitung von Videos nimmt tendenziell viel Speicher an, sodass das Speichern einiger Prozent pro Bild das System weniger stressig hält.) Einige Bilder werden auch auf 270 ° (oder -90 °, wenn Sie es vorziehen) gedreht und müssen korrekt gedreht werden. Dies geschieht auch im Bild -Konditionierungsschritt.
Das verarbeitete Bild wird dann über Kernbildfilterfunktionen pixiert. Insbesondere ist die häufigste Filterblockcam -Verwendung CIPixellate (obwohl andere Pixellationsfilter je nach endgültiger Form verwendet werden). Die Größe der einzelnen pixellierten Region hängt von den Benutzereinstellungen ab. Je kleiner die Größe ist, desto größer ist die Auswirkung auf die Gesamtleistung, obwohl CIPixellate (und wie Filter) immer noch sehr schnell sind. Der Grund, warum kleinere pixellierte Regionen die Leistung erhöhen, liegt darin, dass später mehr 3D -Knoten benötigt werden.
Das folgende Bild zeigt die Pixellation des Originalbildes. Beachten Sie, dass jede pixellierte Region eine feste Farbe hat, was bedeutet, dass Blockcam nicht die gesamte Region lesen muss, um die Farbe zu erhalten - nur ein Pixel.

Das pixellierte Bild wird dann analysiert. Dies beinhaltet die Farbe der einzelnen pixelierten Region. Dies ist ein langsamer als erwarteter Schritt. Das Erhalten von individuellen Pixeldaten aus einem Bild erfordert eine große Manipulation von Bilddaten, um das Bild bereitzustellen, um abfragt zu werden. Am Ende dieses Schritts werden Bilder nicht mehr verwendet. Ein 2D -Array von Farbdaten wird an den nächsten Schritt übergeben.
In diesem Schritt werden pixellierte Bilddaten in lokalem Dateispeicher gespeichert. Dies dient dazu, geringfügige visuelle Änderungen zu vereinfachen, die später vom Benutzer angefordert werden.
Die endgültige Knotenform ist eine Benutzereinstellung. Mit Blockcam können Benutzer aus einer von vielen Formen auswählen-die eingebauten Formen laufen in der Regel schneller als nicht gebaute Formen (z. B. sind Kugeln schneller als Pentagone). Für jede Farbe wird ein 3D -Knoten aus dem Bild -Parsen -Schritt unter Verwendung der angegebenen Geometrie erzeugt. Um die 3D-Ness der letzten Szene zu demonstrieren, sind Knoten in gewisser Dimensionen übertrieben. Wenn beispielsweise Würfel die vom Benutzer ausgewählte Form sind, wird die Länge übertrieben. Übertreibung wird durch die Farbe bestimmt - die Farbe wird verwendet, um die diffuse Oberfläche des Knotens zu beschatten und die Höhe zu bestimmen. Die Übertreibung wird durch eine vom Benutzer ausgewählte Determinante bestimmt:
Sobald ein Knoten erstellt wurde, wird er einem Masterknoten hinzugefügt. Sobald alle Knoten erstellt und in den Master -Knoten eingegeben wurden, wird der Masterknoten selbst in die 3D -Szene eingereicht.
Dies mag ein trivialer Schritt erscheinen, aber es ist sehr schwierig, Videos zu konvertieren. Wenn ein Bild konvertiert wird, wird nur die 3D -Szene aktualisiert und schließlich dem Benutzer angezeigt (normalerweise innerhalb von 0,5 bis 2,0 Sekunden). Für Videos ist es wichtig, das Timing des Displays richtig zu machen: Um ein Video zu konvertieren, wird jeder Frame durch diese Schritte ausgeführt, und dann wird eine Schnappschuss aus der 3D -Szene aufgenommen. Wenn der Snapshot vor der Anzeige der Szene aufgenommen wird, ist das Ergebnis ein reines schwarzes Bild, was der Benutzer nicht sehen möchte. Daher muss Blockcam am SCNSceneRendererDelegate -Satz von Funktionen teilnehmen, um zu wissen, wann eine Szene für den Benutzer tatsächlich sichtbar ist.
Das folgende Bild ist die endgültige, verarbeitete Version des Bildes. Dies ist die Ausgabe eines snapshot() -Anrufs auf der SCNView. Die Probe verwendet extrudierte Blöcke und wird in der Standard -Kameraausrichtung betrachtet.

Sobald das Bild angezeigt wird, hat der Benutzer die Option, es so zu speichern oder einige visuelle Aspekte zu bearbeiten oder zu drehen oder ein- oder auszureisen und dann (vielleicht wieder) zu speichern. Bei Videos wird die Szene entsorgt, sobald ein Schnappschuss der 3D -Szene erfasst ist.
Abhängig vom Wert von .SaveOriginalImageAction Wenn der Benutzer das verarbeitete Bild speichert, wird Metadaten zusammen mit dem verarbeiteten Bild gespeichert. Die Metadaten bestehen aus dem Namen und der Version des Programms sowie den im Bildungsgeschäft erstellten Parametern.
Das Speichern von verarbeiteten Dateien ist ein mehrstufiger Prozess:
/Scratch als Standard .jpg -Datei gespeichert..jpg -Datei) neu angelegt wird.PHAssetCreationRequest mit den entsprechenden Parametern - dies wird benötigt, da die häufigere Methode zum Verschieben von Bildern in die FOTO -RALL -STRIPS EXIF -Daten)./Scratch -Verzeichnis gelöscht.Blockcam speichert Metadaten in verarbeiteten Dateien.
| Gruppe | Etikett | Gespeicherte Werte |
|---|---|---|
| Tiff | Künstler | Wenn der Benutzer aktiviert ist, Name des Benutzers. |
| Tiff | Copyright | Wenn der Benutzer aktiviert ist, ist die Copyright -Zeichenfolge des Benutzers. |
| Tiff | Software | Blockcams Name, Version und Buildnummern. |
| Exif | UserCompment | Liste der Parameter, die zum Generieren des verarbeiteten Bildes verwendet werden. |
Siehe auch die Datenschutzdiskussion.
Ein vereinfachtes Durchflussdiagramm für die Bildverarbeitung ist unten gezeigt.

Aufgrund der Zeit, die ein Bild vorbereitet und pixiert, wird jedes Mal, wenn ein neues Bild verarbeitet wird, Pixellationsdaten (bestehend aus einer Reihe von Farben) im Dateisystem des Geräts gespeichert. Wenn der Benutzer dann einen Parameter (z. B. eine 3D -Form) ändert, wurde bereits abgeschlossen und die Pixellationsdaten wiederverwendet. Dies kann möglicherweise viel Zeit sparen.
Wenn der Benutzer einen Parameter ändert, der die Vorverarbeitung beeinflusst, wird das Bild von Anfang an neu verarbeitet. (Zum Beispiel führt die Änderung der Blockgröße zu einem vollständigen Wiederaufbereitungszyklus.)
Ein vereinfachtes Durchflussdiagramm für die Videoverarbeitung ist unten gezeigt. Der Würfel bezieht sich auf den Bildfluss.

Derzeit funktioniert die Green Box ("verarbeitetes Rahmen") nicht wie erwartet/erforderlich, so dass die Videoerstellung nicht unterstützt wird.
Blockcam protokolliert Nachrichten und Status zur Laufzeit zur Debug -Konsole (falls vorhanden und in der überwiegenden Mehrheit der Fälle nicht vorhanden sein) und in einer lokalen SQLite -Datenbank. Dies ermöglicht das Debuggen nach dem Mortem, falls der Bedarf erfolgt.
Angesichts der Richtlinien von Apple zur Datenmiete (ganz zu schweigen von den Richtlinien der EU) wird es für jede veröffentlichte Version von Blockcam (über Kompilierungs-Zeit-Flags) (über Kompilierungs-Zeit-Flags) ausreichend protokolliert.
Alle Benutzereinstellungen (und einige Prozesseinstellungen) werden über die Settings gespeichert. Diese Klasse fasst einen Speichermechanismus zusammen, der für den Rest des Programms unsichtbar ist. Derzeit ist der Speichermechanismus UserDefaults . Sollten Einstellungen komplexer werden, ist es einfach, diese in eine Datenbank zu migrieren.
Um auf Einstellungen zuzugreifen, müssen Anrufer die bereitgestellten Methoden der Settings verwenden. Dies hilft, die Integrität des Datentyps sicherzustellen.
Die Settings enthält auch die Benachrichtigung über Änderungen auf Einstellungsebene (was der Hauptgrund für die Erstellung der Klasse in erster Linie war).
Blockcam -Einstellungen werden unten angezeigt.
| Symbol | Typ | Standard | Verwendung |
|---|---|---|---|
| .Initialisiert | Saite | "Initialisiert" | Flag, das feststellt, ob Einstellungen initialisiert wurden oder nicht. Wenn Blockcam zum ersten Mal ausgeführt wird, wird das erste Mal, dass Blockcam ausgeführt wurde, wenn .Initialized ist, null oder leer, und schreibt daher Standardwerte für alle Einstellungen. |
| .Blocksize | Ganze Zahl | 48 | Blockgröße für die Bildverarbeitung. Dies ist die quadratische Größe jeder pixelierten Region. |
| .Hapetype | Saite | "Blöcke" | Das gleiche des 3D -Objekts in jeder Pixellationsregion. Aus einer Aufzählung gegossen. |
| .Inverthoight | Boolean | FALSCH | Die Flagge der Umkehrhöhe/Größenbestimmung. |
| .Heightsource | Saite | "Helligkeit" | Der Farbkanal, der zur Bestimmung der Höhe/Größe verwendet wird. Aus einer Aufzählung gegossen. |
| .ImageSizeconstraints | Saite | "Medium" | Bestimmt die Menge der Größe der Größe des Bildes, bevor es aus Leistungsgründen verarbeitet wird. Aus einer Aufzählung gegossen. Der tatsächliche Wert zur Laufzeit interpretiert. |
| .Vertische Extraination | Saite | "Medium" | Die Menge an vertikaler Übertreibung, die beim Extrudieren oder Vergrößerung von 3D -Formen durchgeführt werden muss. Aus einer Aufzählung gegossen. |
| .Inputqualität | Ganze Zahl | 2 | Wert, der die Eingangsqualität angibt. Reicht von 0 bis 3, wobei 3 die höchste Qualität (und am langsamsten zu verarbeiten) sind. |
| .CurrentCamera | Saite | "Zurück" | Die Position der letzten verwendeten Kamera. Entweder vorne oder hinten. Aus einer Aufzählung gegossen. |
| .LightColor | Saite | "Weiß" | Name der Farbe des Lichts. Aus einer Aufzählung gegossen. Kann später in eine Farbe der Farbbibliothek konvertiert werden. |
| .LightType | Saite | "Omni" | Name des Lichttyps, der verwendet wird, um die Szene zu beleuchten. Aus einer Aufzählung gegossen. |
| .Lightintensity | Saite | "Normal" | Intensität des Lichts, das verwendet wurde, um die Szene zu beleuchten. Der tatsächliche Wert zur Laufzeit ermittelt. Aus einer Aufzählung gegossen. |
| .Fieldofview | Saite | "Normal" | Sichtfeld der Kamera. Der tatsächliche Wert wird zur Laufzeit bestimmt. Aus einer Aufzählung gegossen. |
| .Showhistogramm | Boolean | FALSCH | Zeigen Sie die Histogrammanzeige. Derzeit nicht implementiert. |
| .Histogrambucketcount | Ganze Zahl | 256 | Anzahl der Farben in der Histogrammanzeige. Derzeit nicht implementiert. |
| .Initialview | Saite | "Liveview" | Die letzte Ansicht, die der Benutzer (wie Live -Ansicht, Alben usw.) gesehen hat. |
| .FullyExtrudeLetters | Boolean | WAHR | Bestimmt, ob Buchstaben vollständig extrudiert oder nur teilweise extrudiert sind. |
| .Letterwinkligkeit | Saite | "Glatt" | Bestimmt, wie reibungslos Kurven in Buchstaben erstellen. Hochwertige Kurven haben große Leistungskosten. Der tatsächliche Wert zur Laufzeit ermittelt. Aus einer Aufzählung gegossen. |
| .Letterfont | Saite | "Futura" | Die Schriftart (und das optionale Gewicht), um extrudierte Buchstaben zu rendern. Wenn die Schrift nicht im System vorhanden ist, tritt Blockcam in einen undefinierten Zustand ein. |
| .Randomcharactersource | Saite | "Lateinisch" | Mit dem UNICODE -Bereich von Zeichen als Quelle für zufällige Buchstaben beim Extrudieren von Zeichen verwendet. Mehrere Bereiche können angegeben werden, indem sie jeweils von den anderen mit einem Komma getrennt werden. |
| .Videofps | Ganze Zahl | 1 | Derzeit nicht verwendet. |
| .Videodimensionen | Saite | "Kleinstes" | Bestimmt die endgültige Videogröße beim Generieren von Videos. Der tatsächliche Wert zur Laufzeit ermittelt. Aus einer Aufzählung gegossen. |
| .Videoblocksize | Ganze Zahl | 48 | Blockgröße für die Videoverarbeitung. Dies ist die quadratische Größe jeder pixelierten Region. |
| .Usemetal | Boolean | WAHR | Flag, das Blockcam anspricht, Metall und OpenGL zu verwenden. |
| .AntialiasingMode | Ganze Zahl | 0 | Bestimmt den Antialiasing -Modus. |
| .InitialBestfit | Boolean | FALSCH | Wenn Blockcam stimmt, versucht Blockcam, alle Knoten so fest wie möglich in die Ansicht zu passen. |
| .SaveoriginalImageAction | Saite | "Stets" | Bestimmt, wie und wann Originalbilder gespeichert werden sollen. Aus einer Aufzählung gegossen. |
| .NextsequentialInteger | Ganze Zahl | 0 | Verwendet für die Dateinamengenamengenerierung. |
| .LoopsequentialIntegerafter | Ganze Zahl | 9999 | Bestimmt, wann bei der Verwendung sequentieller Ganzzahlen an den Start geschleudert werden sollen. |
| .StartSequentialIntegerAt | Ganze Zahl | 1 | Startwert für sequentielle Ganzzahlen. |
| .IncreaseStarApexesWithProminence | Boolean | FALSCH | Wenn wahr, nimmt die Anzahl der Apexes für Sternformen mit der Bedeutung der Farbhöhe zu. |
| .Starapexcount | Ganze Zahl | 5 | Anzahl der Apexes für Sterne. Wenn .IncreaseStarApexesWithProminence -withPromince wahr ist, ist dies die Startzahl der Apexes. |
| .Haltwhecriticalthermie | Boolean | WAHR | Wenn er stimmt, hält Blockcam (über einen fatalError -Aufruf), wenn es einen kritischen thermischen Alarm erhält. Dies kann gegen die Apple -Richtlinien verstoßen und kann entfernt werden. |
| .Haltonlowpower | Boolean | WAHR | Wenn Blockcam (über einen fatalError -Aufruf) anhält, wenn es eine Warnung mit geringer Leistung erhält. Dies kann gegen die Apple -Richtlinien verstoßen und kann entfernt werden. |
| .BestfitOffset | Doppelt | 2.0 | Wert, um die Kamera zu unterstützen, wenn .InitialBestFit wahr ist, um dem Bild etwas negativer Platz zu verleihen. |
| .Lightingmodel | Saite | "Phong" | Oberflächenmaterialbeleuchtungsmodell. Aus einer Aufzählung gegossen. |
| .CaptalleballLocation | Saite | "Spitze" | Position des Balls ("Mütze") für kappenförmige Knoten. Aus einer Aufzählung gegossen. |
| .LoggingEnabled | Boolean | FALSCH | Aktivieren Sie die Protokollierungsflagge. |
| .FontSize | Ganze Zahl | 36 | Die Schriftgröße für extrudierte Buchstaben. |
| .Enableuisounds | Boolean | WAHR | Flag, um UI -Geräusche abzuspielen (z. B. wenn eine Taste gedrückt wird). Wenn dieser Wert false ist, werden alle anderen Klangflaggen ignoriert. |
| .EnableshoundSound | Boolean | FALSCH | Flag, um einen Verschlussschall zu spielen, wenn die Kamera -Taste gedrückt wird. An einigen geografischen Standorten geschieht dies immer und das Festlegen dieses Wertes hat keine Auswirkung. |
| .EnableImageProcessingSound | Boolean | WAHR | Fahnen Sie zu Beginn und am Ende der Bildverarbeitung einen Ton ab. Da die Bildverarbeitung zeitaufwändig ist, hilft dies dem Benutzer, zu verstehen, wann das Bild abgeschlossen ist. |
| .EnableVideoreCordingsound | Boolean | WAHR | Flag, um einen Ton abzuspielen, wenn der Benutzer startet und nicht mehr ein Video aufzeichnet. |
| .EnableButtonpressounds | Boolean | WAHR | Facken Sie einen Ton ab, um einen Ton abzuspielen, wenn der Benutzer Schaltflächen drückt. |
| .EnableOptionsElektSounds | Boolean | WAHR | Flag, um einen Ton abzuspielen, wenn der Benutzer eine Option in der Anzeige der Bildschirmeinstellungen auswählt. |
| .EnablecrashSounds | Boolean | FALSCH | Flag, um einen Ton abzuspielen, wenn ein Crash -Dialog angezeigt wird. Nur aktiviert, wenn er im #Debug -Modus kompiliert wird. |
| .MeshdotSize | Saite | "Medium" | Größe des Mittelpunkts für Maschen. Wenn .None verwendet wird, wird kein Mittelpunkt angezeigt. Aus einer Aufzählung gegossen. |
| .Meshlinethickness | Saite | "Medium" | Dicke der Netzleitungen. Aus einer Aufzählung gegossen. |
| .Radiatinglinethickness | Saite | "Medium" | Dicke der Strahlungsleitungsformen. Aus einer Aufzählung gegossen. |
| .RadiatingLinEcount | Ganze Zahl | 8 | Anzahl der Strahlungsleitungen in einer Strahlungsleitungsform. 4 ist für Linien, die auf die Kardinalanweisungen hinweisen, 8 für die Kardinalanweisungen und in Between und 16 für 8 weitere Linien in der Z-Ebene. |
| .Blockchamfersize | Saite | "Keiner" | Die Glätte der Schurke Radius/Kante für Blockformen. Aus einer Aufzählung gegossen. |
| .Maximagedimension | Ganze Zahl | 1024 | Maximale Dimension eines Bildes. Wenn ein zu verarbeitender Bild größer ist, wird es so geändert, dass die längste Dimension dieser Wert ist. |
| .AdduserDatatoexif | Boolean | FALSCH | Flag, um benutzergezogene Informationen zum Exif-Block der verarbeiteten Bilder hinzuzufügen. Wenn dieser Wert im #Debug -Modus kompiliert wird, stand dies für true. |
| .Unername | Saite | "" " | (Standard ist leer.) Der benutzerversorgte Name, der dem exif-Block von verarbeiteten Bildern hinzugefügt wird. Dies geschieht nur, wenn .AddUserDataToExif wahr ist. Wenn dieser Wert im #Debug -Modus kompiliert wird, stellt er "Stuart Rankin" standardmäßig. |
| .Usercopyright | Saite | "" " | (Standard ist leer.) Der von Benutzer gelieferte Copyright-Zeichenfolge, der zum exif-Block von verarbeiteten Bildern hinzugefügt wird. Dies geschieht nur, wenn .AddUserDataToExif wahr ist. Wenn dieser Wert im #Debug -Modus kompiliert wird, stellt es "Attribution 3.0 Unported (CC" von 3.0). |
| .Coneisinverted | Boolean | WAHR | Bestimmt, ob Kegelforme in Bezug auf die Z-Tiefe umgekehrt sind. |
| .Conetopoptions | Saite | .TopIsZero .RawValue | Optionen zur Bestimmung des oberen Radius des Kegels. |
| .Conebaseoptions | Saite | .BaseIsSide .RawValue | Optionen zur Bestimmung des Basisradius des Kegels. |
| .Showsplashscreen | Boolean | WAHR | Flag, das bestimmt, ob der Begrüßungsbildschirm beim Start angezeigt wird oder nicht. |
| .HuesShapelist | Saite | "" " | Liste der Formen für den Farbtyp der Farbtyp Variante. |
| .Saturierungsshapelist | Saite | "" " | Liste der Formen für den Formyp der Sättigungsvariante. |
| .Brightnessshapelist | Saite | "" " | Liste der Formen für den Typ der Helligkeitsvariante. |
Blockcam verwendet die 3D -Verarbeitung, die den Grafikchip des Geräts ausübt. Wenn der Benutzer Einstellungen mit höchster Qualität angibt, kann es zu bestimmten extremen Bedingungen kommen. Um das Gerät vor Schäden zu bewahren, stehen Einstellungen zur Verfügung, um die Ausführung von Blockcam in diesem Fall abzubrechen.
| Ereignis | Aktion | Steuereinstellung |
|---|---|---|
| Thermal | Wenn ein thermisches Ereignis die kritische Stufe erreicht (buchstäblich .critical true in der Benachrichtigung), wird ein tödlicher Fehler erzeugt, um jegliche durch Blockcam erzeugte thermische Spannung zu verringern. | .HaltWhenTooHot |
| Batterie | Wenn die Batterie in einen Zustand true niedrigem Stromverbrauch eintritt, wird ein tödlicher Fehler erzeugt, um die Lebensdauer der Batterie vor dem Aufladen zu erhalten. | .HaltOnLowPower |
Blockcam unterstützt die folgenden Visuals:
Die folgenden Formen werden derzeit für Extrusionseffekte unterstützt (oder geplant, um unterstützt zu werden):
| Form | Einheimisch | Notizen |
|---|---|---|
| Blöcke | Ja - SCNBox | Native Box -Formen verlängerten sich entlang der Z -Achse. |
| Dreiecke | NEIN | Benutzerdefinierte gleichseitige Dreiecksformen. |
| Pentagone | NEIN | Benutzerdefinierte äquilaterale Pentagon -Formen. |
| Sechsecke | NEIN | Benutzerdefinierte äquilaterale sechseckige Formen. |
| Oktogonen | NEIN | Benutzerdefinierte achteckige achteckige Formen. |
| Pyramiden | Ja - SCNPyramid | Einheimische Pyramidenformen. |
| Toroide | Ja - SCNTorus | Einheimische Torusformen. |
| Zylinder | Ja - SCNCylinder | Native Zylinderformen - sorgt für schöne erhöhte Kreise. |
| Kugeln | Ja - SCNSphere | Native Kugelformen. |
| Kapseln | Ja - SCNCapsule | Native Kapselformen. Nicht so interessant wie sie klingen. |
| Tetraedrons | NEIN | Benutzerdefinierte gleichseitige Tetraeder -Feststoff. |
| Sterne | NEIN | Benutzerdefinierte Sternformen (mit radial gleichen Apexen). Kann die Anzahl der Apexes variieren. |
| Kombiniert | Ja - Kombination | Kombinierte Kugel, Torus und Kapsel. |
| Kombiniertforhsb | Ja - Kombination | Kombinierte Kugel, Torus und Kapsel. |
| Maschen | NEIN | Derzeit nicht implementiert. |
| Briefe | Ja SCNText | Einheimischer extrudierter Text. Ist tendenziell außergewöhnlich langsam, insbesondere bei Nicht-Latin-Alphabeten. |
| Linien | Ja - SCNCapsule | Sehr dünne Kapselform. |
| Cappedlines | Ja - Kombination | Sehr dünne Kapselform mit einer Kugel, die je nach Benutzereinstellungen oben, Mitte oder Boden der Linie platziert ist. |
| Strahlungslinien | Ja - Kombination | Mehrere Linien aus dem Mittelpunkt ausstrahlen. Der Benutzer kann angeben, wie viele Zeilen. Dies ist eine leistungsstarke Form. |
| Haueinreichend | Varianten | Die Form an einem bestimmten Punkt wird durch den Farbton der pixierten Region bestimmt, sodass die tatsächliche endgültige Form variiert. |
| Sättigende | Varianten | Die Form an einem bestimmten Punkt wird durch die Sättigung der pixelierten Region bestimmt, sodass die tatsächliche endgültige Form variiert. |
| Helligkeitsstörung | Varianten | Die Form an einem bestimmten Punkt wird durch die Helligkeit der pixellierten Region bestimmt, sodass die tatsächliche endgültige Form variiert. |
Jede Form für eine repräsentative pixelierte Region ist extrudiert oder vergrößert. Die Bestimmung der Extrusionstiefe oder der vergrößerten Größe hängt von der Farbe der pixierten Region ab.
| Farbkanal | Verwendung |
|---|---|
| Farbton | Der Farbton der Farbe bestimmt die Tiefe/Größe des 3D -Objekts. Beachten Sie, dass die Farbtonwerte zyklisch sind (wobei 0,0 im Wesentlichen die gleichen wie 1,0 sind), sodass rötliche Pixel unterdrückt werden, während grün hervorgehoben wird. |
| Sättigung | Der Farbsättigungswert bestimmt Tiefe/Größe. Hellere Farben werden größer sein. |
| Helligkeit | Die Helligkeit der Farbe bestimmt Tiefe/Größe. Dies ist der Standardwert und wie die meisten Menschen erwarten würden, dass das Programm funktioniert. |
| Rot | Der rote Kanal wird verwendet, um die Tiefe/Größe zu bestimmen. |
| Grün | Der grüne Kanal wird verwendet, um die Tiefe/Größe zu bestimmen. |
| Blau | Der blaue Kanal wird verwendet, um die Tiefe/Größe zu bestimmen. |
| Cyan | Ein synthetischer Cyan -Kanal (aus CMYK) wird verwendet, um die Tiefe/Größe zu bestimmen. |
| Magenta | Ein synthetischer Magenta -Kanal (von CMYK) wird verwendet, um die Tiefe/Größe zu bestimmen. |
| Gelb | Ein synthetischer gelber Kanal (von CMYK) wird verwendet, um die Tiefe/Größe zu bestimmen. |
| Schwarz | Ein synthetischer schwarzer Kanal (von CMYK) wird verwendet, um die Tiefe/Größe zu bestimmen. |
| Yuv: y | Der synthetische Y -Kanal aus einer YUV -Umwandlung. |
| Yuv: u | Der synthetische U -Kanal aus einer YUV -Umwandlung. |
| Yuv: v | Der synthetische V -Kanal aus einer YUV -Umwandlung. |
Blockcam unterstützt eine umgekehrte Flagge. Dies bedeutet, wenn der Benutzer invertiert wird, ist die Tiefe/Größe ein Reziprokol von sich selbst, was dunkle Bereiche prominente und leichte Bereiche verfolgt oder verborgen macht.
Blockcam unterstützt das Ändern der Farbe des Lichts sowie die Art des Lichts. Die Farben beschränken sich derzeit auf einen kleinen Satz vordefinierter Farben. Die nicht parametisierten Leuchten von Lichter parallel Szenekit (wie .omni und .spot ).
Die Position des Lichts ist derzeit vom Benutzer nicht einstellbar.
BlockCam verwendet das SCNView allowsCameraControl -Flag den Benutzer durch Gesten vergrößern, schweißen oder (in drei Achsen) drehen.
Wenn sie anfänglich wiedergegeben werden, scheint das Ergebnis relativ weit von der Sicht entfernt zu sein. BlockCam verfügt über ein benutzerfreundliches Flag, das das Bild an die Ansicht anpasst. Diese Funktion verwirrt allowsCameraControl in Bezug auf das Vergrößern und Schrumpfen.
In diesem Abschnitt werden verschiedene Details auf Implementierungsebene erörtert.
Blockcam wurde in Swift 5 mit Xcode 11.3 geschrieben.
Angesichts der längeren Zeitspanne, die zum Verarbeiten von Bildern benötigt wird, erfolgt die gesamte Bildverarbeitung auf einem Hintergrund -Thread. Dies erfordert, dass die gesamte Kommunikation den Benutzer über die Benutzeroberfläche mit den richtigen Threading -Aufrufen aktualisiert.
TBD
Blockcam ist Copyright © 2019, 2020 von Stuart Rankin
日本語版 «Google 翻訳で翻訳»
3d ブロックカメラ
Blockcam は iOS および iPados 用のカメラプログラムで、 Avfoundation を介して画像を取得し、それらの画像を単純な 3d シーンに変換します。シーンは、ユーザーによって回転および拡大縮小され、フラットイメージとして保存されます。
Blockcam は Stuart Rankin によって作成されました。
Blockcam のバージョン管理はVersioning.swiftファイルで管理され、ビルド前のスクリプトステップとしてビルドごとに自動的に更新されます。 更新にはビルド id 、ビルド番号、時刻、日付が含まれますが、現在、バージョン番号は手動で更新する必要があります。 以下の現在のビルド文字列も同じメカニズムによって維持されます。 以下の現在のビルド文字列も同じメカニズムによって維持されます。
現在、バージョン管理プログラムは Blockcam プロジェクトファイルのバージョン番号を更新しません。
最新のビルド : : バージョン情報については、英語のセクションを参照してください。
バージョンとビルドの更新方法については、 GitHub の [VersionUpdater] (https://github.com/sjrankin/versionupdater )リポジトリを参照してください。
Blockcam は、可能な限りユーザーが提供する情報を含むように設計されています。 ユーザーを特定できる情報が使用されるたびに、 Blockcam はそれを明示的に要求します。 設計上、 Blockcam はデフォルトでユーザーを特定できる情報を収集しません。 ユーザーは、このタイプの情報の収集を許可するためにアクティブな手順を実行する必要があります。 ユーザーは、このタイプの情報の収集を許可するためにアクティブな手順を実行する必要があります。
| 識別情報 | 使用 | 保管 |
|---|---|---|
| ユーザー名 | 処理された画像のメタデータに保存されるユーザーの名前(ユーザーが入力)。 | 「UserDefaults 」に保存されます。 |
| ユーザー著作権 | 処理された画像メタデータに保存されるユーザーの著作権文字列(ユーザーが入力)。 | 「UserDefaults 」に保存されます。 |
ユーザーが Blockcam をインスタンス化すると、ライブビューモードで開きます(メイン画面にカメラのビューを表示)。ユーザーには、次の 3 つのモードのいずれかを選択するオプションがあります。
Blockcam は、次のプラットフォームでテストされています。
1.主な問題はパフォーマンスです。 古い携帯電話の大きなサイズの画像で使用すると、パフォーマンスが大幅に低下します。 ただし、セルフィーカメラは実際には非常に高速です。 BlockCamには、パフォーマンスの問題を軽減するのに役立つ特定の軽減策(ユーザー設定など)があります。 2. *漢字は非常に遅いです。*漢字を使用して押し出し画像を作成するには、古いiPhoneの場合、6分程度かかります。 3.以下でのみテスト済み:iPhone 6S +、iPhone 8、iPad Mini4。iPadPro 9.7。 4. MacCatalystは、MacカメラのAVFoundationの使用をサポートしていないため、非常に困難です。 MacCatalystバージョンでの作業は、その妨害のため現在のところ停止しています。 5.ヒストグラムはまだ実装されていません。 6.非組み込みの幾何学的図形は、組み込みの図形よりも大幅に遅いように見えます。 7. iPadOSおよびiOS 13には、混乱するデバッグセッションにつながるいくつかの追加のデバッグステートメントが残っているようです。具体的には、「BackgroundTaskを終了できません」メッセージです。
UIBezierPathを使用してさらにシェイプを追加します。 2.処理済みのライブビュー(現在の写真モードと同様)のみを表示する処理済みライブビューモードを追加します。 これはおそらく非常に電力を消費し、遅くなり、最新のハードウェアでのみ確実に動作する可能性があります。 3.ビデオを共有する-現在、画像のみを共有できます。 4.ピクセル化されたデータの使用を完全に実装します。 ほとんどのコードが配置されています。 この機能は、処理された画像データをピクセル化レベル(たとえば、各ピクセル領域の色)でユーザーのファイルシステム空間にファイルとして保存します。 利点は、形状や押し出しの深さなどの特定の設定をユーザーが変更したときに処理を高速化することです。 BlockCamには、パフォーマンスに関する4つの懸念事項があります。
BlockCamは、取り込まれた各画像をCoreImageフィルターCIPixellateを介してピクセル化された画像に変換します。 ピクセル化の後、処理アルゴリズムは高さの決定を計算します-高さはノードのサイズまたはノードの押し出しを決定します。 次に、ピクセル化された画像の各ピクセルが3D形状(ユーザーが設定)に変換され、3Dビューの現在のシーンに追加されます。
すべての処理操作は同じコードを使用しますが、有効なユーザー向けモードに応じて異なる方法(または複数回)で呼び出すことができます。
処理のために画像が取得されます。画像のソースは、iOS / iPadOSで読み取り可能な標準の画像である限り重要ではありません。画像の最も一般的なソースは、おそらくライブビューカメラです。他のソースは、フォトアルバムとビデオフレームです。
次の画像は、処理のソースです。 (これは私が初冬に庭で撮った画像です。)

画像を変換するためのパフォーマンスの犠牲を考えると、ユーザーはソース画像をより小さなサイズにサイズ変更することにより、実行される作業量を削減するオプションがあります。これは、ビデオが処理される場合、ユーザーの介入なしに発生することもあります。 (ビデオの処理は多くのメモリを消費する傾向があるため、画像ごとに数パーセントを保存してもシステムのストレスを軽減できます。)一部の画像は270°(または必要に応じて-90°)に回転され、正しく回転します。これは、画像調整ステップでも行われます。
処理された画像は、Core Imageフィルター関数を介してピクセル化されます。具体的には、BlockCamが使用する最も一般的なフィルターは「CIPixellate」です(ただし、最終的な形状に応じて他のピクセル化フィルターが使用されます)。各ピクセル化領域のサイズは、ユーザー設定によって異なります。サイズが小さいほど、全体的なパフォーマンスへの影響は大きくなりますが、「CIPixellate」(およびフィルターと同様)は依然として非常に高速です。ピクセル化された領域が小さくなるとパフォーマンスが向上する理由は、後でより多くの3Dノードが必要になるためです。
次の画像は、元の画像のピクセル化を示しています。各ピクセル化された領域は単色であることに注意してください。つまり、BlockCamは領域全体を読み取って色を取得する必要はなく、1ピクセルだけです。

次に、ピクセル化された画像が解析されます。これには、ピクセル化された各領域の色を取得する必要があります。これは予想よりも遅いステップです。画像から個々のピクセルデータを取得するには、画像を照会できるようにするためだけに大量の画像データ操作が必要です。この手順の最後に、画像は使用されなくなります。カラーデータの2D配列が次のステップに渡されます。
このステップでは、ピクセル化された画像データがローカルファイルストレージに保存されます。 これは、後でユーザーが要求する小さな視覚的な変更を簡素化するためです。
最終的なノード形状はユーザー設定です。 BlockCamを使用すると、ユーザーは多くの形状のいずれかを選択できます。組み込みの形状は、非組み込みの形状よりも速く動作する傾向があります(たとえば、球体は五角形よりも高速です)。指定したジオメトリを使用して、イメージ解析ステップから各色の3Dノードが生成されます。最終シーンの3D性を誇示するために、ノードはある次元で誇張されています。たとえば、キューブがユーザーが選択した形状である場合、長さは誇張されます。誇張は色によって決定されます-色は、ノードの拡散表面を陰影付けするために、また高さを決定するために使用されます。誇張は、ユーザーが選択可能な決定要因によって決定されます。
ノードが作成されると、そのノードはマスターノードに追加されます。すべてのノードが作成されてマスターノードに配置されると、マスターノード自体が3Dシーンに配置されます。
-マスターノードは、後のアニメーションを管理しやすくするために使用されます。
これは簡単な手順のように思えるかもしれませんが、ビデオを変換するときは非常に注意が必要です。画像を変換すると、3Dシーンが更新され、最終的にユーザーに表示されます(通常は0.5〜2.0秒以内)。ビデオの場合、ディスプレイのタイミングを正確にすることが重要です。ビデオを変換するには、各フレームをこれらの手順で実行し、3Dシーンのスナップショットを取得します。シーンが表示される前にスナップショットが撮られた場合、結果は純粋な黒のイメージになりますが、これはユーザーが見たいものではありません。したがって、BlockCamはSCNSceneRendererDelegate関数セットに参加して、シーンが実際にユーザーに表示されるタイミングを知る必要があります。
次の画像は、画像の最終的な処理済みバージョンです。これは、SCNViewでのsnapshot()呼び出しの出力です。サンプルは押し出しブロックを使用し、デフォルトのカメラの向きで表示されています。

画像が表示されると、ユーザーはそれをそのまま保存するか、いくつかの視覚的側面を編集するか、回転またはズームインまたはズームアウトしてから保存する(おそらくもう一度)オプションがあります。ビデオの場合、3Dシーンのスナップショットがキャプチャされると、シーンは破棄されます。
.SaveOriginalImageActionの値に応じて、元の画像が保存されます。 ユーザーが処理された画像を保存すると、メタデータは処理された画像とともに保存されます。 メタデータは、プログラムの名前とバージョン、およびイメージの作成時に有効なパラメーターで構成されます。
処理されたファイルの保存は、複数ステップのプロセスです。
.jpgファイルとして/Scratchディレクトリに保存されます。.jpgファイルとして)。PHAssetCreationRequestを使用します-写真ロールに画像を移動するより一般的な方法はExifデータを削除するためです)。/Scratchディレクトリから削除されます。BlockCamは、処理されたファイルにメタデータを保存します。
| グループ | タグ | 保存された値 |
|---|---|---|
| TIFF | アーティスト | ユーザーが有効にした場合、ユーザーの名前。 |
| TIFF | 著作権 | ユーザーが有効にした場合、ユーザーの著作権文字列。 |
| TIFF | ソフトウェア | BlockCamの名前、バージョン、ビルド番号。 |
| Exif | UserComment | 処理済み画像の生成に使用されるパラメーターのリスト。 |
画像の前処理とピクセル化には時間がかかるため、新しい画像が処理されるたびに、ピクセル化データ(色の配列で構成される)がデバイスのファイルシステムに保存されます。 その後、ユーザーがパラメーター(3D形状など)を変更した場合、前処理は既に完了しており、ピクセル化データは再利用されます。 これにより、大幅に時間を節約できる可能性があります。
ユーザーが前処理に影響するパラメーターを変更すると、画像は最初から再処理されます。 (たとえば、ブロックサイズを変更すると、完全な再処理サイクルが実行されます。)
BlockCamは、実行時のメッセージとステータスをデバッグコンソール(存在する場合、大部分のインスタンスでは存在しない)とローカルSQLiteデータベースに記録します。 これにより 必要が生じた場合の事後デバッグ。
Appleのデータ保持に関するポリシー(EUのポリシーは言うまでもありません)を考えると、BlockCamのすべてのリリースバージョンのログは(コンパイル時フラグを介して)削除される可能性が高いです。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。 このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。 現在、ストレージメカニズムはUserDefaultsです。 設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。 これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamの設定を以下に示します。
| 記号 | タイプ | デフォルト | 使用法 |
|---|---|---|---|
| .Initialized | Saite | "Initialized" | 設定が初期化されたかどうかを決定するフラグ。 BlockCamが最初に実行されるときに、 .Initializedがnilまたは空の場合、BlockCamが最初に実行されたと想定されるため、すべての設定のデフォルト値を書き込みます。 |
| .BlockSize | 整数 | 48 | 画像処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .ShapeType | Saite | "Blocks" | 各ピクセル化領域の3Dオブジェクトと同じ。列挙型からキャストします。 |
| .InvertHeight | Boolean | FALSCH | 反転高さ/サイズ決定フラグ。 |
| .HeightSource | Saite | "Helligkeit" | 高さ/サイズを決定するために使用するカラーチャンネル。列挙型からキャストします。 |
| .ImageSizeConstraints | Saite | "Medium" | パフォーマンス上の理由から、処理する前に行う画像のサイズの縮小量を決定します。列挙型からキャストします。実行時に解釈される実際の値。 |
| .VerticalExaggeration | Saite | "Medium" | 3D形状を押し出しまたは拡大するときに実行する垂直方向の誇張の量。列挙型からキャストします。 |
| .InputQuality | Ganze Zahl | 2 | 入力品質を示す値。 0から3の範囲で、3が最高品質(および処理が最も遅い)です。 |
| .CurrentCamera | Saite | "Zurück" | 最後に使用したカメラの位置。前面または背面。列挙型からキャストします。 |
| .LightColor | Saite | "Weiß" | ライトの色の名前。列挙型からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .LightType | Saite | "Omni" | シーンの照明に使用されるライトのタイプの名前。列挙型からキャストします。 |
| .LightIntensity | Saite | "Normal" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙型からキャストします。 |
| .FieldOfView | Saite | "Normal" | カメラの視野。実際の値は実行時に決定されます。列挙型からキャストします。 |
| .ShowHistogram | Boolean | FALSCH | ヒストグラム表示を表示します。現在実装されていません。 |
| .HistogramBucketCount | 整数 | 256 | ヒストグラム表示の色数。現在実装されていません。 |
| .InitialView | Saite | "LiveView" | ユーザーが最後に表示したビュー(ライブビュー、アルバムなど)。 |
| .FullyExtrudeLetters | Boolean | WAHR | 文字が完全に押し出されるか、部分的にのみ押し出されるかを決定します。 |
| .LetterSmoothness | Saite | "Glatt" | 文字の曲線をどれだけスムーズに作成するかを決定します。高品質の曲線には、大きなパフォーマンスコストがかかります。実行時に決定される実際の値。列挙型からキャストします。 |
| .LetterFont | Saite | "Futura" | 押し出された文字のレンダリングに使用するフォント(およびオプションの太さ)。フォントがシステムに存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | Saite | "Lateinisch" | 文字を押し出すときにランダムな文字のソースとして使用する名前付きUnicode範囲。複数の範囲を指定するには、それぞれをコンマで区切ります。 |
| .VideoFPS | 整数 | 1 | 現在使用されていません。 |
| .VideoDimensions | Saite | "Smallest" | ビデオを生成するときの最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙型からキャストします。 |
| .VideoBlockSize | 整数 | 48 | ビデオ処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .UseMetal | Boolean | WAHR | OpenGLではなくMetalを使用するようにBlockCamに指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチエイリアスモードを決定します。 |
| .InitialBestFit | Boolean | FALSCH | trueの場合、BlockCamは、すべてのノードをビューにできるだけ厳密に合わせようとします。 |
| .SaveOriginalImageAction | Saite | "Stets" | 元の画像を保存する方法とタイミングを決定します。列挙型からキャストします。 |
| .NextSequentialInteger | Ganze Zahl | 0 | ファイル名の生成に使用。 |
| .LoopSequentialIntegerAfter | Ganze Zahl | 9999 | 連続する整数を使用する場合、いつループを開始するかを決定します。 |
| .StartSequentialIntegerAt | Ganze Zahl | 1 | 連続整数の開始値。 |
| .IncreaseStarApexesWithProminence | Boolean | FALSCH | trueの場合、星形の頂点の数は色の高さが顕著になるにつれて増加します。 |
| .StarApexCount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceがtrueの場合、これは頂点の開始数です。 |
| .HaltWhenCriticalThermal | Boolean | WAHR | trueの場合、BlockCamは重大な温度アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .HaltOnLowPower | Boolean | WAHR | trueの場合、BlockCamは低電力アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .BestFitOffset | Doppelt | 2.0 | .InitialBestFitがtrueの場合にカメラを後退させて、画像にもう少しネガティブなスペースを与えるために使用する値。 |
| .LightingModel | Saite | "Phong" | 表面マテリアル照明モデル。列挙型からキャストします。 |
| .CappedLineBallLocation | Saite | "Spitze" | CappedLine形状のノードのボール(「キャップ」)の位置。列挙型からキャストします。 |
| .LoggingEnabled | Boolean | FALSCH | ロギングフラグを有効にします。 |
| .FontSize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .EnableUISounds | Boolean | WAHR | Flagは、UIサウンドを再生します(ボタンが押されたときなど)。 この値が「false」の場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | Boolean | FALSCH | Flagは、カメラボタンが押されたときにシャッター音を再生します。 一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .EnableImageProcessingSound | Boolean | WAHR | Flagは、画像処理の開始時と終了時に音声を再生します。 画像処理には時間がかかるため、ユーザーは画像がいつ完成するかを理解するのに役立ちます。 |
| .EnableVideoRecordingSound | Boolean | WAHR | ユーザーがビデオの記録を開始および停止したときに音を再生するフラグ。 |
| .EnableButtonPressSounds | Boolean | WAHR | ユーザーがボタンを押したときに音を再生するフラグ。 |
| .EnableOptionSelectSounds | Boolean | WAHR | ユーザーが画面上の設定画面でオプションを選択したときに音を再生するフラグ。 |
| .EnableCrashSounds | Boolean | FALSCH | フラグは、クラッシュダイアログが表示されたときにサウンドを再生します。 #DEBUGモードでコンパイルされた場合のみ有効です。 |
| .MeshDotSize | Saite | "Medium" | メッシュの中心ドットのサイズ。 .Noneが使用される場合、中央のドットは表示されません。 列挙型からキャストします。 |
| .MeshLineThickness | Saite | "Medium" | メッシュラインの太さ。 列挙型からキャストします。 |
| .RadiatingLineThickness | Saite | "Medium" | 放射線形状の太さ。 列挙型からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射ライン形状の放射ラインの数。 「4」は基線方向を指す線、「8」は基線方向とその中間、および「16」はz平面のさらに8本の線を示します。 |
| .BlockChamferSize | Saite | "Keiner" | ブロック形状の面取り半径/エッジの滑らかさ。 列挙型からキャストします。 |
| .MaxImageDimension | 整数 | 1024 | 画像の最大寸法。 処理する画像が大きい場合、最長寸法がこの値になるようにサイズ変更されます。 |
| .AddUserDataToExif | Boolean | FALSCH | Flagは、ユーザーが作成した情報を処理済み画像のExifブロックに追加します。 |
| .UserName | Saite | "" " | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の名前。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します。 |
| .UserCopyright | Saite | "" " | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の著作権文字列。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します |
BlockCamは次のビジュアルをサポートしています。
現在、押し出し効果では次の形状がサポートされています(またはサポートされる予定です)。
| 形状 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい- SCNBox | Z軸に沿って長くなったネイティブボックスの形状。 |
| 三角形 | いいえ | カスタム正三角形の形状。 |
| 五角形 | いいえ | カスタム正五角形。 |
| 六角形 | いいえ | カスタム正六角形。 |
| オクトゴン | いいえ | カスタム正八角形。 |
| ピラミッド | はい- SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい- SCNTorus | ネイティブトーラス形状。 |
| シリンダー | はい- SCNCylinder | 自然なシリンダー形状-すてきな高架円になります。 |
| 球 | はい- SCNSphere | ネイティブの球形。 |
| カプセル | はい- SCNCapsule | ネイティブカプセルの形状。聞こえるほど面白くない。 |
| 四面体 | いいえ | カスタム正四面体ソリッド。 |
| 星 | いいえ | カスタム星形(半径方向に等しい頂点を持つ)。頂点の数を変えることができます。 |
| CombinedForRGB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| CombinedForHSB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| レター | はい- SCNText | ネイティブの押し出しテキスト。特に非ラテン系のアルファベットでは、非常に遅くなる傾向があります。 |
| 行 | はい- SCNCapsule | 非常に薄いカプセル形状。 |
| CappedLines | はい-組み合わせ | ユーザー設定に応じて、行の上部、中間、または下部に球体を配置した非常に薄いカプセル形状。 |
| RadiatingLines | はい-組み合わせ | 中心点から放射状に広がる複数の線。 ユーザーは行数を指定できます。 これはパフォーマンス重視の形状です。 |
代表的なピクセル化領域の各形状は、押し出しまたは拡大されます。押し出しの深さまたは拡大サイズの決定は、ピクセル化された領域の色に依存します。
| カラーチャンネル | 使用方法 |
|---|---|
| Farbton | 色の色相は、3Dオブジェクトの深さ/サイズを決定します。色相値は周期的であることに注意してください(0.0は基本的に1.0と同じです)。したがって、緑が強調表示されている間、赤みを帯びたピクセルは抑制される傾向があります。 |
| 彩度 | 彩度の値は深さ/サイズを決定します。明るい色は大きくなります。 |
| 明るさ | 色の明るさが深さ/サイズを決定します。これはデフォルト値であり、ほとんどの人がプログラムが機能することを期待する方法です。 |
| 赤 | 赤チャネルは深さ/サイズを決定するために使用されます。 |
| 緑 | 緑のチャネルは深さ/サイズを決定するために使用されます。 |
| 青 | 青チャンネルは深さ/サイズを決定するために使用されます。 |
| シアン | (CMYKからの)合成シアンチャンネルを使用して、深度/サイズを決定します。 |
| マゼンタ | 深さ/サイズを決定するために、CMYKからの合成マゼンタチャネルが使用されます。 |
| 黄色 | 合成の黄色チャンネル(CMYKから)を使用して深さ/サイズを決定します。 |
| 黒 | 深さ/サイズを決定するために、CMYKからの合成黒チャンネルが使用されます。 |
BlockCamは反転フラグをサポートしています。これは、ユーザーが反転を設定した場合、深度/サイズはそれ自体の比isであり、暗い領域を目立たせ、明るい領域を抑制または非表示にすることを意味します。
BlockCamは、ライトの色とライトの種類の変更をサポートしています。 色は現在、事前定義された色の小さなセットに制限されています。 ライトのタイプは、SceneKitの標準のパラメータ化されていないライト( .omniや.spotなど)に対応しています。
現在、ライトの位置はユーザーが調整することはできません。
BlockCamは、 SCNViewのallowsCameraControlフラグを使用して、ユーザーがジェスチャによって拡大、光沢、回転(3軸)できるようにします。
最初にレンダリングしたとき、結果はビューから比較的遠くにあるように見える場合があります。 BlockCamには、画像をビューに合わせるためのユーザー設定可能なフラグがあります。 この機能は、拡大と縮小に関してallowsCameraControlを混同する傾向があります。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。現在、ストレージメカニズムはUserDefaultsです。設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamは3D処理を使用し、デバイスのグラフィックチップを実行します。ユーザーが最高品質の設定を指定した場合、特定の極端な条件が発生する可能性があります。デバイスを損傷から保護するために、そのような場合にBlockCamの実行を中止する設定を使用できます。
| イベント | アクション | 設定の制御 |
|---|---|---|
| Thermal | サーマルイベントがクリティカルステージ(通知では文字通り.critical )に達すると、設定がtrueの場合、BlockCamによって作成される熱ストレスを減らす致命的なエラーが生成されます。 | .HaltWhenTooHot |
| バッテリー | バッテリーが低電力状態になった場合、設定がtrueの場合、再充電前にバッテリーの寿命を保つために致命的なエラーが生成されます。 | .HaltOnLowPower |
BlockCamの著作権©2019, 2020 by Stuart Rankin