Cámara de bloque 3D
BlockCam es un programa de cámara para iOS y iPados que toma imágenes a través de Avfoundation y luego convierte esas imágenes en escenas 3D simples. Las escenas pueden ser rotadas y escaladas por el usuario, y guardadas como una imagen plana.
Blockcam fue escrito por Stuart Rankin.
El verso para BlockCam se mantiene en el archivo Versioning.swift y se actualiza automáticamente con cada compilación como un paso de script previo a la construcción. La actualización incluye ID de compilación, números de compilación, tiempos y fechas, pero los números de versión se deben actualizar actualmente a mano. La cadena de compilación actual a continuación también es mantenida por el mismo mecanismo.
El programa de versiones no actualiza actualmente los números de versión del archivo del proyecto BlockCam.
Construcción más reciente: Versión 0.9 Alfa, construcción 3287, Fecha de construcción: 13 de julio de 2021, 16:06
Consulte el repositorio de VersionUpdater en GitHub para obtener información sobre cómo se actualizan las versiones y las construcciones.
BlockCam está diseñado para contener información proporcionada por el usuario tanto como sea posible. Cada vez que se utiliza información identificable por el usuario, BlockCam lo solicitará explícitamente. Por diseño, BlockCam no recopila ninguna información identificable por el usuario de forma predeterminada; El usuario debe tomar medidas activas para permitir la recopilación de este tipo de información.
| Información identificable | Usar | Almacenamiento |
|---|---|---|
| Nombre de usuario | El nombre del usuario (ingresado por el usuario) se almacenará en metadatos de imagen procesados. | Almacenado en UserDefaults . |
| Copyright de usuario | La cadena de derechos de autor del usuario (ingresada por el usuario) para almacenar en metadatos de imagen procesados. | Almacenado en UserDefaults . |
Cuando el usuario instancia blockcam, se abre en modo de vista en vivo (que muestra la vista de la cámara en la pantalla principal). El usuario tiene la opción de elegir uno de los tres modos:
BlockCam ha sido probado en las siguientes plataformas:
UIBezierPath para agregar más formas.Hay cuatro preocupaciones de rendimiento para BlockCam:
autoreleasepool , se han abordado la mayoría de las preocupaciones. Si resulta que esto es insuficiente, existe un plan de mitigación: guarde todas las imágenes de scratch al almacenamiento local, léalas solas y procesarlas una a la vez. Esto ralentizará las cosas pero reducirá la presión de la memoria. BlockCam convierte cada imagen que se toma en una imagen pixelada a través de CoreImage Filter CIPixellate . Después de la pixelación, el algoritmo de procesamiento calcula la altura determinada: la altura determina el tamaño de un nodo o la extrusión de un nodo. Luego, cada píxel de la imagen pixelada se convierte en una forma 3D (establecida por el usuario) y luego se agrega a la escena actual en la vista 3D.
Todas las operaciones de procesamiento utilizan el mismo código, pero pueden llamarse de manera diferente (o varias veces) dependiendo del modo orientado al usuario en vigencia.
Se adquiere una imagen para el procesamiento. La fuente de la imagen no es importante siempre que sea una imagen estándar, legible para iOS/iPados. La fuente más común de imágenes probablemente será la cámara de vista en vivo. Otras fuentes son el álbum de fotos y los marcos de video.
La siguiente imagen es la fuente del procesamiento. (Esta es una imagen que tomé de nuestro jardín a principios de invierno).

Dado el gasto de rendimiento de convertir la imagen, el usuario tiene la opción de reducir la cantidad de trabajo realizado haciendo que la imagen de origen redimensione a un tamaño más pequeño. Esto también puede ocurrir sin la intervención del usuario en caso de que se procesen los videos. (El procesamiento de videos tiende a tomar mucha memoria, por lo que incluso guardar un poco por ciento por imagen ayudará a mantener las cosas menos estresantes en el sistema). Algunas imágenes también se giran a 270 ° (o -90 ° si lo prefiere) y deben girarse correctamente. Esto también se hace en el paso de acondicionamiento de la imagen.
La imagen procesada se pixelada a través de funciones de filtro de imagen central. Específicamente, los usos de bloqueo de filtro más comunes es CIPixellate (aunque se utilizan otros filtros de pixelación dependiendo de la forma final). El tamaño de cada región pixelada depende de la configuración del usuario. Cuanto más pequeño sea el tamaño, mayor es el impacto en el rendimiento general, aunque CIPixellate (y como filtros) sigue siendo muy rápido. La razón por la cual las regiones pixeladas más pequeñas aumentan el rendimiento es porque se requerirán más nodos 3D más adelante.
La siguiente imagen muestra la pixelación de la imagen original. Tenga en cuenta que cada región pixelada es un color sólido, lo que significa que BlockCam no tiene que leer toda la región para obtener el color, solo un píxel.

La imagen pixelada se analiza. Esto implica obtener el color de cada región pixelada. Este es un paso más lento de lo esperado. Obtener datos de píxeles individuales de una imagen requiere una gran cantidad de manipulación de datos de imagen solo para que la imagen esté lista para ser consultada. Al final de este paso, las imágenes ya no se usan. Se pasa una matriz 2D de datos de color al siguiente paso.
En este paso, los datos de imagen de pixellado se guarda en el almacenamiento de archivos locales. Esto es para simplificar los cambios visuales menores solicitados más tarde por el usuario.
La forma del nodo final es una configuración de usuario. BlockCam permite a los usuarios seleccionar de una de las muchas formas: las formas incorporadas tienden a funcionar más rápido que las formas no construidas (por ejemplo, las esferas son más rápidas que los pentágonos). Se genera un nodo 3D para cada color desde el paso de análisis de la imagen utilizando la geometría especificada. Para mostrar el 3D de la escena final, los nodos son exagerados en alguna dimensión. Por ejemplo, si los cubos son la forma seleccionada por el usuario, la longitud se exagerará. La exageración está determinada por el color: el color se usa para sombrear la superficie difusa del nodo, así como para determinar la altura. La exageración está determinada por un determinante selectable del usuario:
Una vez que se ha creado un nodo, se agrega a un nodo maestro. Una vez que todos los nodos han sido creados y colocados en el nodo maestro, el nodo maestro en sí se coloca en la escena 3D.
Si bien esto puede parecer un paso trivial, es muy complicado al convertir videos. Si la conversión de una imagen, todo lo que sucede es que la escena 3D se actualiza y finalmente se muestra al usuario (generalmente dentro de 0.5 a 2.0 segundos). Para los videos, es fundamental obtener el momento correcto de la pantalla: para convertir un video, cada cuadro se ejecuta a través de estos pasos y luego se toma una instantánea de la escena 3D. Si la instantánea se toma antes de que se haya mostrado la escena, el resultado será una imagen negra pura, que no es lo que el usuario quiere ver. Por lo tanto, BlockCam debe participar en el conjunto de funciones SCNSceneRendererDelegate para saber cuándo una escena es realmente visible para el usuario.
La siguiente imagen es la versión final procesada de la imagen. Esta es la salida de una llamada snapshot() en el SCNVIEW. La muestra utiliza bloques extruidos y se está viendo en la orientación predeterminada de la cámara.

Una vez que se muestra la imagen, el usuario tiene la opción de guardarla como es o editar algunos aspectos visuales o girar o acercarse o salir, y luego guardarla (nuevamente, tal vez). Para los videos, una vez que se captura una instantánea de la escena 3D, la escena se elimina.
Dependiendo del valor de .SaveOriginalImageAction , la imagen original se guardará. Cuando el usuario guarda la imagen procesada, los metadatos se guardan junto con la imagen procesada. Los metadatos consisten en el nombre y la versión del programa, así como los parámetros vigentes cuando se creó la imagen.
Guardar archivos procesados es un proceso de varios pasos:
/Scratch como un archivo .jpg estándar..jpg ).PHAssetCreationRequest con el conjunto de parámetros apropiados: esto es necesario porque el método más común para mover imágenes a los datos de tiras de tiradas de fotos EXIF)./Scratch .BlockCam guarda metadatos en archivos procesados.
| Grupo | Etiqueta | Valores almacenados |
|---|---|---|
| PELEA | Artista | Si el usuario lo habilita, el nombre del usuario. |
| PELEA | Derechos de autor | Si el usuario está habilitado, la cadena de copyright del usuario. |
| PELEA | Software | El nombre, la versión y los números de compilación de Blockcam. |
| Exif | Comercio de usuarios | Lista de parámetros utilizados para generar la imagen procesada. |
Ver también la discusión de privacidad.
A continuación se muestra un diagrama de flujo simplificado para el procesamiento de imágenes.

Debido a la cantidad de tiempo que lleva preprocesar y pixellate una imagen, cada vez que se procesa una nueva imagen, los datos de pixelación (que consisten en una matriz de colores) se guarda en el sistema de archivos del dispositivo. Si el usuario cambia un parámetro (como una forma 3D), el preprocesamiento ya se ha completado y los datos de pixelación se reutilizan. Esto puede ahorrar mucho tiempo.
Si el usuario cambia un parámetro que afecta el preprocesamiento, la imagen se reprocesa desde el principio. (Por ejemplo, el cambio de tamaño del bloqueo hará que se ejecute un ciclo de reprocesamiento completo).
A continuación se muestra un diagrama de flujo simplificado para el procesamiento de video. El cubo se refiere al flujo de la imagen.

Actualmente, el cuadro verde ("marco procesado") no funciona como se esperaba/requerido para que a partir de la escritura actual, la creación de video no es compatible.
BlockCam registra mensajes y estado en tiempo de ejecución a la consola de depuración (si está presente, y en la gran mayoría de los casos, esto no estará presente) y a una base de datos local de SQLite. Esto permite la depuración post mortem en caso de que surja la necesidad.
Dada la política de Apple sobre la alquiler de datos (sin mencionar las políticas de la UE), es probable que se elimine el registro (a través de banderas de tiempo de compilación) para cualquier versión lanzada de BlockCam.
Todas las configuraciones del usuario (y algunas configuraciones de proceso) se almacenan a través de la clase Settings . Esta clase encapsula un mecanismo de almacenamiento que es invisible para el resto del programa. Actualmente, el mecanismo de almacenamiento es UserDefaults . Si la configuración se vuelve más compleja, es sencillo migrar esto a una base de datos.
Para acceder a la configuración, las personas que llaman deben usar los métodos proporcionados de la clase Settings . Esto ayuda a garantizar la integridad del tipo de datos.
La clase Settings también proporciona una notificación de nivel de nivel de configuración (que fue la razón principal para crear la clase en primer lugar).
La configuración de BlockCam se presentan a continuación.
| Símbolo | Tipo | Por defecto | Uso |
|---|---|---|---|
| .Initializado | Cadena | "Inicializado" | Indicador que determina si la configuración se ha inicializado o no. Cuando BlockCam se ejecuta por primera vez, si .Initialized es nulo o vacío, supone que es la primera vez que BlockCam se ejecuta y, por lo tanto, escribe los valores predeterminados para todas las configuraciones. |
| . | Entero | 48 | Tamaño del bloque para el procesamiento de imágenes. Este es el tamaño cuadrado de cada región pixelada. |
| . | Cadena | "Bloques" | Lo mismo del objeto 3D en cada región de pixelación. Emitido de un enum. |
| .Invertheight | Booleano | FALSO | El indicador de determinación de altura/tamaño invertido. |
| .HeightSource | Cadena | "Brillo" | El canal de color que se utilizará para determinar la altura/tamaño. Emitido de un enum. |
| .ImagesizeConstracts | Cadena | "Medio" | Determina la cantidad de reducción en el tamaño de la imagen que debe hacer antes de procesarla por razones de rendimiento. Emitido de un enum. Valor real interpretado en el tiempo de ejecución. |
| . VERCICALEXAGERACIÓN | Cadena | "Medio" | La cantidad de exageración vertical para realizar al extruir o ampliar formas 3D. Emitido de un enum. |
| .InputQuality | Entero | 2 | Valor que indica la calidad de entrada. Varía de 0 a 3 con 3 de la más alta calidad (y más lenta para procesar). |
| .CurrentCamera | Cadena | "Atrás" | La posición de la última cámara utilizada. Ya sea frontal o hacia atrás. Emitido de un enum. |
| .Lightcolor | Cadena | "Blanco" | Nombre del color de la luz. Emitido de un enum. Puede convertirse en un tipo de color de biblioteca de colores más tarde. |
| .Lighttype | Cadena | "Omni" | Nombre del tipo de luz utilizado para iluminar la escena. Emitido de un enum. |
| . | Cadena | "Normal" | Intensidad de la luz utilizada para iluminar la escena. Valor real determinado en tiempo de ejecución. Emitido de un enum. |
| .FieldOfView | Cadena | "Normal" | Campo de visión de la cámara. El valor real se determina en tiempo de ejecución. Emitido de un enum. |
| .Showhistogram | Booleano | FALSO | Muestre la pantalla del histograma. No se implementa actualmente. |
| .Histogrambucketcount | Entero | 256 | Número de colores en la pantalla de histograma. No se implementa actualmente. |
| .Initialview | Cadena | "LiveView" | La última vista vista por el usuario (como View Live, álbumes, etc.). |
| .Fullyextrudeletters | Booleano | verdadero | Determina si las letras están completamente extruidas o solo parcialmente extruidas. |
| .Lettersmothness | Cadena | "Liso" | Determina cuán suavemente crear curvas en letras. Las curvas de alta calidad tienen un gran costo de rendimiento. Valor real determinado en tiempo de ejecución. Emitido de un enum. |
| .Letterfont | Cadena | "Futura" | La fuente (y el peso opcional) para usar para hacer letras extruidas. Si la fuente no existe en el sistema, BlockCam ingresará a un estado indefinido. |
| .RandomcharacterSource | Cadena | "Latín" | Nombrado rango de caracteres Unicode para usar como fuente de letras aleatorias al extruir los caracteres. Se pueden especificar múltiples rangos separando cada uno de los demás con una coma. |
| .Videofps | Entero | 1 | No se usa actualmente. |
| .Videodimensiones | Cadena | "Pequeñísimo" | Determina el tamaño final del video al generar video. Valor real determinado en tiempo de ejecución. Emitido de un enum. |
| . | Entero | 48 | Tamaño del bloque para el procesamiento de video. Este es el tamaño cuadrado de cada región pixelada. |
| .Usemetal | Booleano | verdadero | Flag que le dice a BlockCam que use metal en lugar de OpenGL. |
| . AntialiasingMode | Entero | 0 | Determina el modo antialiasing. |
| .InitialBestFit | Booleano | FALSO | Si es cierto, BlockCam intentará adaptarse a todos los nodos a la vista con la mayor fuerza posible. |
| .SaveOriginalImageaction | Cadena | "Siempre" | Determina cómo y cuándo guardar imágenes originales. Emitido de un enum. |
| .NextSequialInteger | Entero | 0 | Utilizado para la generación de nombres de archivo. |
| .OopSequialentIntegerAfter | Entero | 9999 | Determina cuándo recorrer al inicio cuando se usa enteros secuenciales. |
| . | Entero | 1 | Valor inicial para enteros secuenciales. |
| .Ncraseestarapexeswithprominence | Booleano | FALSO | Si es cierto, el número de ápice para formas de estrellas aumenta con la prominencia de la altura del color. |
| .StarapexCount | Entero | 5 | Número de ápice para estrellas. Si .IncreaseStarApexesWithProminence IncreaseStarapexeswithprominence es cierto, este es el número inicial de APEXES. |
| .Halthencriticalthermal | Booleano | verdadero | Si es cierto, BlockCam se detendrá (a través de una llamada fatalError ) cuando reciba una alerta térmica crítica. Esto puede violar las pautas de Apple y puede eliminarse. |
| .HaltonlowPower | Booleano | verdadero | Si es verdadero, BlockCam se detendrá (a través de una llamada fatalError ) cuando reciba una alerta de baja potencia. Esto puede violar las pautas de Apple y puede eliminarse. |
| .BestFitOffset | Doble | 2.0 | Valor para usar para respaldar la cámara cuando .InitialBestFit InitialBestFit es cierto para dar un poco más de espacio negativo a la imagen. |
| .Luminador | Cadena | "Phong" | Modelo de iluminación de material de superficie. Emitido de un enum. |
| .Location de línea de línea | Cadena | "Arriba" | Ubicación de la pelota ("Cap") para nodos en forma de línea limitada. Emitido de un enum. |
| .GOGGINGENABLED | Booleano | FALSO | Habilitar la bandera de registro. |
| . | Entero | 36 | El tamaño de fuente para letras extruidas. |
| . | Booleano | verdadero | Flag para reproducir sonidos de interfaz de usuario (como cuando se presiona un botón). Si este valor es false , se ignoran todas las otras banderas de sonido. |
| . | Booleano | FALSO | Bandera para reproducir un sonido de obturador cuando se presiona el botón de la cámara. En algunas ubicaciones geográficas, esto siempre sucede y establecer este valor no tendrá efecto. |
| . | Booleano | verdadero | Marcar para reproducir un sonido al comienzo y al final del procesamiento de imágenes. Dado que el procesamiento de imágenes requiere mucho tiempo, esto ayuda al usuario a comprender cuándo se completa la imagen. |
| .EnableVideRecordingSound | Booleano | verdadero | Flaja para reproducir un sonido cuando el usuario comience y deja de grabar un video. |
| . | Booleano | verdadero | Marcar para reproducir un sonido cuando el usuario presione los botones. |
| .EnableOptionsElectSounds | Booleano | verdadero | Marcar para reproducir un sonido cuando el usuario selecciona una opción en la pantalla de configuración en pantalla. |
| .EnablecrashSounds | Booleano | FALSO | Bandera para reproducir un sonido cuando se muestra un diálogo de bloqueo. Habilitado solo cuando se compila en el modo #Debug . |
| .Meshdotsize | Cadena | "Medio" | Tamaño del punto central para mallas. Si se usa .None , no se mostrará ningún punto central. Emitido de un enum. |
| .Meshlinethickness | Cadena | "Medio" | Grosor de las líneas de malla. Emitido de un enum. |
| .RadiatingLinethickness | Cadena | "Medio" | Grosor de las formas de la línea radiante. Emitido de un enum. |
| .Radiatinglinecount | Entero | 8 | Número de líneas radiantes en forma de línea radiante. 4 es para líneas que apuntan hacia las direcciones cardinales, 8 para las direcciones cardinales y en el medio, y 16 para 8 líneas más en el plano Z. |
| .BlockChamFersize | Cadena | "Ninguno" | La suavidad del radio/borde del colgante para formas de bloque. Emitido de un enum. |
| .Maximedimension | Entero | 1024 | Dimensión máxima de una imagen. Si una imagen para procesar es mayor, se cambiará el tamaño de que la dimensión más larga sea este valor. |
| .Adduserdatatoexif | Booleano | FALSO | Indicador para agregar información creada por el usuario al bloque EXIF de imágenes procesadas. Si se compila en el modo #DEBUG, este valor predeterminado es verdadero. |
| .Nombre de usuario | Cadena | " | (El valor predeterminado está en blanco). El nombre proporcionado por el usuario que se agrega al bloque EXIF de imágenes procesadas. Esto sucede solo si .AddUserDataToExif es cierto. Si se compila en el modo #Debug, este valor vale la pena a "Stuart Rankin". |
| .Sercopyright | Cadena | " | (El valor predeterminado está en blanco). La cadena de copyright proporcionada por el usuario que se agrega al bloque EXIF de imágenes procesadas. Esto sucede solo si .AddUserDataToExif es cierto. Si se compila en el modo #Debug, este valor predetermina "Atribución 3.0 Unported (CC por 3.0)". |
| .ConeisInverted | Booleano | verdadero | Determina si las formas de cono se invierten en términos de profundidad z. |
| .ConetopOptions | Cadena | .TopIsZero .RawValue | Opciones para determinar el radio superior del cono. |
| .Conebaseoptions | Cadena | .BaseIsSide .RawValue | Opciones para determinar el radio base del cono. |
| .Showsplashscreen | Booleano | verdadero | FLAG que determina si la pantalla de salpicaduras se muestra al inicio o no. |
| . | Cadena | " | Lista de formas para el tipo de forma de variante de tono. |
| . | Cadena | " | Lista de formas para el tipo de forma de variante de saturación. |
| .Brightnessshapelist | Cadena | " | Lista de formas para el tipo de forma de variante de brillo. |
BlockCam utiliza el procesamiento 3D, que ejerce el chip gráfico del dispositivo. Si el usuario especifica la configuración de la más alta calidad, es posible que ocurran ciertas condiciones extremas. Para ayudar a preservar el dispositivo del daño, la configuración está disponible para abortar la ejecución de BlockCam cuando eso sucede.
| Evento | Acción | Configuración de control |
|---|---|---|
| Térmico | Si un evento térmico alcanza la etapa crítica ( true .critical | .HaltWhenTooHot |
| Batería | Si la batería ingresa a un estado de baja energía, si la configuración es true , se generará un error fatal para ayudar a preservar la vida de la batería antes de recargar. | .HaltOnLowPower |
BlockCam admite las siguientes imágenes:
Actualmente se admiten las siguientes formas (o planificadas para ser compatibles) para los efectos de extrusión:
| Forma | Nativo | Notas |
|---|---|---|
| Bloques | SÍ - SCNBox | Formas de caja nativa alargadas a lo largo del eje Z. |
| Triángulos | No | Formas de triángulo equilibrados personalizados. |
| Pentágonos | No | Formas de Pentágono EXILATERALES Custom. |
| Hexágonos | No | Formas hexagonales equilibradas personalizadas. |
| Octogones | No | Formas octogonales equilibradas personalizadas. |
| Pirámides | Sí - SCNPyramid | Formas piramidales nativas. |
| Toroides | Si - SCNTorus | Formas del toro nativo. |
| Cilindros | Sí - SCNCylinder | Formas nativas de cilindro: es círculos elevados agradables. |
| Esferas | Sí - SCNSphere | Formas de la esfera nativa. |
| Cápsulas | Sí - SCNCapsule | Formas de la cápsula nativa. No es tan interesante como suenan. |
| Tetrahedrons | No | Tetraedro de tetraedro equilibrado personalizado. |
| Estrellas | No | Formas de estrella personalizadas (con ápice radialmente igual). Puede variar el número de ápices. |
| Combinado ForrgB | Sí - Combinación | Esfera combinada, toro y cápsula. |
| Combinada parahsb | Sí - Combinación | Esfera combinada, toro y cápsula. |
| Malla | No | No se implementa actualmente. |
| Letras | SÍ - SCNText | Texto extruido nativo. Tiende a ser extraordinariamente lento, especialmente con alfabetos no latinos. |
| Pauta | Sí - SCNCapsule | Forma de la cápsula muy delgada. |
| Líneas limitadas | Sí - Combinación | Forma de la cápsula muy delgada con una esfera colocada en la parte superior, media o parte inferior de la línea dependiendo de la configuración del usuario. |
| Líneas de radiación | Sí - Combinación | Múltiples líneas que irradian desde el punto central. El usuario puede especificar cuántas líneas. Esta es una forma de rendimiento pesado. |
| Huevar | variantes | La forma en un punto dado está determinada por el tono de la región pixelada, por lo que la forma final real variará. |
| Saturación | variantes | La forma en un punto dado está determinada por la saturación de la región pixelada, por lo que la forma final real variará. |
| Brillo | variantes | La forma en un punto dado está determinada por el brillo de la región pixelada, por lo que la forma final real variará. |
Cada forma para una región pixelada representativa está extruida o agrandada. La determinación de la profundidad de extrusión o el tamaño agrandado depende del color de la región pixelada.
| Canal de color | Uso |
|---|---|
| Matiz | El tono del color determina la profundidad/tamaño del objeto 3D. Tenga en cuenta que los valores de tono son cíclicos (con 0.0 es esencialmente los mismos que 1.0), por lo que los píxeles rojizos tienden a ser sometidos mientras se resaltan el verde. |
| Saturación | El valor de saturación de color determina la profundidad/tamaño. Los colores más brillantes serán más grandes. |
| Brillo | El brillo del color determina la profundidad/tamaño. Este es el valor predeterminado y cómo la mayoría de la gente esperaría que funcione el programa. |
| Rojo | El canal rojo se usa para determinar la profundidad/tamaño. |
| Verde | El canal verde se usa para determinar la profundidad/tamaño. |
| Azul | El canal azul se usa para determinar la profundidad/tamaño. |
| Cian | Se utiliza un canal de cian sintético (de CMYK) para determinar la profundidad/tamaño. |
| Magenta | Se utiliza un canal magenta sintético (de CMYK) para determinar la profundidad/tamaño. |
| Amarillo | Se usa un canal amarillo sintético (de CMYK) para determinar la profundidad/tamaño. |
| Negro | Se usa un canal negro sintético (de CMYK) para determinar la profundidad/tamaño. |
| Yuv: Y | El canal Y sintético de una conversión de YUV. |
| Yuv: u | El canal U sintético a partir de una conversión de YUV. |
| Yuv: V | El canal V sintético de una conversión de YUV. |
BlockCam admite una bandera invertida. Esto significa que si el usuario establece invertido, la profundidad/tamaño es un reciprocolo de sí mismo, lo que hace que las áreas oscuras sean prominentes y las áreas ligeras sometidas o ocultas.
BlockCam admite cambiar el color de la luz, así como el tipo de luz. Los colores se limitan actualmente a un pequeño conjunto de colores predefinidos. Los tipos de luces paralelas a las luces estándar y no parametizadas de Scineekit (como .omni y .spot ).
La posición de la luz no es actualmente ajustable por el usuario.
BlockCam utiliza el indicador de SCNView allowsCameraControl para permitir que el usuario se amplíe, bromea o gire (en tres ejes) a través de gestos.
Cuando inicialmente se representa, el resultado puede parecer relativamente lejos de la vista. BlockCam tiene una bandera establecida por el usuario para adaptarse a la imagen a la vista. Esta característica tiende a confundir allowsCameraControl con respecto a la ampliación y la reducción.
Esta sección discutirá varios detalles de nivel de implementación.
Blockcam fue escrito en Swift 5 con Xcode 11.3.
Dada la larga cantidad de tiempo que lleva procesar imágenes, todo el procesamiento de imágenes se realiza en un hilo de fondo. Esto requiere que toda la comunicación actualice al usuario a través de la interfaz de usuario con las llamadas de subproceso adecuadas.
TBD
Blockcam es Copyright © 2019, 2020 por 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は、処理されたファイルにメタデータを保存します。
| グループ | タグ | 保存された値 |
|---|---|---|
| PELEA | アーティスト | ユーザーが有効にした場合、ユーザーの名前。 |
| PELEA | 著作権 | ユーザーが有効にした場合、ユーザーの著作権文字列。 |
| PELEA | ソフトウェア | BlockCamの名前、バージョン、ビルド番号。 |
| Exif | UserComment | 処理済み画像の生成に使用されるパラメーターのリスト。 |
画像の前処理とピクセル化には時間がかかるため、新しい画像が処理されるたびに、ピクセル化データ(色の配列で構成される)がデバイスのファイルシステムに保存されます。 その後、ユーザーがパラメーター(3D形状など)を変更した場合、前処理は既に完了しており、ピクセル化データは再利用されます。 これにより、大幅に時間を節約できる可能性があります。
ユーザーが前処理に影響するパラメーターを変更すると、画像は最初から再処理されます。 (たとえば、ブロックサイズを変更すると、完全な再処理サイクルが実行されます。)
BlockCamは、実行時のメッセージとステータスをデバッグコンソール(存在する場合、大部分のインスタンスでは存在しない)とローカルSQLiteデータベースに記録します。 これにより 必要が生じた場合の事後デバッグ。
Appleのデータ保持に関するポリシー(EUのポリシーは言うまでもありません)を考えると、BlockCamのすべてのリリースバージョンのログは(コンパイル時フラグを介して)削除される可能性が高いです。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。 このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。 現在、ストレージメカニズムはUserDefaultsです。 設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。 これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamの設定を以下に示します。
| 記号 | タイプ | デフォルト | 使用法 |
|---|---|---|---|
| .Initialized | Cadena | "Initialized" | 設定が初期化されたかどうかを決定するフラグ。 BlockCamが最初に実行されるときに、 .Initializedがnilまたは空の場合、BlockCamが最初に実行されたと想定されるため、すべての設定のデフォルト値を書き込みます。 |
| .BlockSize | 整数 | 48 | 画像処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .ShapeType | Cadena | "Blocks" | 各ピクセル化領域の3Dオブジェクトと同じ。列挙型からキャストします。 |
| .InvertHeight | Booleano | FALSO | 反転高さ/サイズ決定フラグ。 |
| .HeightSource | Cadena | "Brillo" | 高さ/サイズを決定するために使用するカラーチャンネル。列挙型からキャストします。 |
| .ImageSizeConstraints | Cadena | "Medio" | パフォーマンス上の理由から、処理する前に行う画像のサイズの縮小量を決定します。列挙型からキャストします。実行時に解釈される実際の値。 |
| .VerticalExaggeration | Cadena | "Medio" | 3D形状を押し出しまたは拡大するときに実行する垂直方向の誇張の量。列挙型からキャストします。 |
| .InputQuality | Entero | 2 | 入力品質を示す値。 0から3の範囲で、3が最高品質(および処理が最も遅い)です。 |
| .CurrentCamera | Cadena | "Atrás" | 最後に使用したカメラの位置。前面または背面。列挙型からキャストします。 |
| .LightColor | Cadena | "Blanco" | ライトの色の名前。列挙型からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .LightType | Cadena | "Omni" | シーンの照明に使用されるライトのタイプの名前。列挙型からキャストします。 |
| .LightIntensity | Cadena | "Normal" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙型からキャストします。 |
| .FieldOfView | Cadena | "Normal" | カメラの視野。実際の値は実行時に決定されます。列挙型からキャストします。 |
| .ShowHistogram | Booleano | FALSO | ヒストグラム表示を表示します。現在実装されていません。 |
| .HistogramBucketCount | 整数 | 256 | ヒストグラム表示の色数。現在実装されていません。 |
| .InitialView | Cadena | "LiveView" | ユーザーが最後に表示したビュー(ライブビュー、アルバムなど)。 |
| .FullyExtrudeLetters | Booleano | verdadero | 文字が完全に押し出されるか、部分的にのみ押し出されるかを決定します。 |
| .LetterSmoothness | Cadena | "Liso" | 文字の曲線をどれだけスムーズに作成するかを決定します。高品質の曲線には、大きなパフォーマンスコストがかかります。実行時に決定される実際の値。列挙型からキャストします。 |
| .LetterFont | Cadena | "Futura" | 押し出された文字のレンダリングに使用するフォント(およびオプションの太さ)。フォントがシステムに存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | Cadena | "Latín" | 文字を押し出すときにランダムな文字のソースとして使用する名前付きUnicode範囲。複数の範囲を指定するには、それぞれをコンマで区切ります。 |
| .VideoFPS | 整数 | 1 | 現在使用されていません。 |
| .VideoDimensions | Cadena | "Pequeñísimo" | ビデオを生成するときの最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙型からキャストします。 |
| .VideoBlockSize | 整数 | 48 | ビデオ処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .UseMetal | Booleano | verdadero | OpenGLではなくMetalを使用するようにBlockCamに指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチエイリアスモードを決定します。 |
| .InitialBestFit | Booleano | FALSO | trueの場合、BlockCamは、すべてのノードをビューにできるだけ厳密に合わせようとします。 |
| .SaveOriginalImageAction | Cadena | "Siempre" | 元の画像を保存する方法とタイミングを決定します。列挙型からキャストします。 |
| .NextSequentialInteger | Entero | 0 | ファイル名の生成に使用。 |
| .LoopSequentialIntegerAfter | Entero | 9999 | 連続する整数を使用する場合、いつループを開始するかを決定します。 |
| .StartSequentialIntegerAt | Entero | 1 | 連続整数の開始値。 |
| .IncreaseStarApexesWithProminence | Booleano | FALSO | trueの場合、星形の頂点の数は色の高さが顕著になるにつれて増加します。 |
| .StarApexCount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceがtrueの場合、これは頂点の開始数です。 |
| .HaltWhenCriticalThermal | Booleano | verdadero | trueの場合、BlockCamは重大な温度アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .HaltOnLowPower | Booleano | verdadero | trueの場合、BlockCamは低電力アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .BestFitOffset | Doble | 2.0 | .InitialBestFitがtrueの場合にカメラを後退させて、画像にもう少しネガティブなスペースを与えるために使用する値。 |
| .LightingModel | Cadena | "Phong" | 表面マテリアル照明モデル。列挙型からキャストします。 |
| .CappedLineBallLocation | Cadena | "Arriba" | CappedLine形状のノードのボール(「キャップ」)の位置。列挙型からキャストします。 |
| .LoggingEnabled | Booleano | FALSO | ロギングフラグを有効にします。 |
| .FontSize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .EnableUISounds | Booleano | verdadero | Flagは、UIサウンドを再生します(ボタンが押されたときなど)。 この値が「false」の場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | Booleano | FALSO | Flagは、カメラボタンが押されたときにシャッター音を再生します。 一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .EnableImageProcessingSound | Booleano | verdadero | Flagは、画像処理の開始時と終了時に音声を再生します。 画像処理には時間がかかるため、ユーザーは画像がいつ完成するかを理解するのに役立ちます。 |
| .EnableVideoRecordingSound | Booleano | verdadero | ユーザーがビデオの記録を開始および停止したときに音を再生するフラグ。 |
| .EnableButtonPressSounds | Booleano | verdadero | ユーザーがボタンを押したときに音を再生するフラグ。 |
| .EnableOptionSelectSounds | Booleano | verdadero | ユーザーが画面上の設定画面でオプションを選択したときに音を再生するフラグ。 |
| .EnableCrashSounds | Booleano | FALSO | フラグは、クラッシュダイアログが表示されたときにサウンドを再生します。 #DEBUGモードでコンパイルされた場合のみ有効です。 |
| .MeshDotSize | Cadena | "Medio" | メッシュの中心ドットのサイズ。 .Noneが使用される場合、中央のドットは表示されません。 列挙型からキャストします。 |
| .MeshLineThickness | Cadena | "Medio" | メッシュラインの太さ。 列挙型からキャストします。 |
| .RadiatingLineThickness | Cadena | "Medio" | 放射線形状の太さ。 列挙型からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射ライン形状の放射ラインの数。 「4」は基線方向を指す線、「8」は基線方向とその中間、および「16」はz平面のさらに8本の線を示します。 |
| .BlockChamferSize | Cadena | "Ninguno" | ブロック形状の面取り半径/エッジの滑らかさ。 列挙型からキャストします。 |
| .MaxImageDimension | 整数 | 1024 | 画像の最大寸法。 処理する画像が大きい場合、最長寸法がこの値になるようにサイズ変更されます。 |
| .AddUserDataToExif | Booleano | FALSO | Flagは、ユーザーが作成した情報を処理済み画像のExifブロックに追加します。 |
| .Nombre de usuario | Cadena | " | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の名前。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します。 |
| .UserCopyright | Cadena | " | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の著作権文字列。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します |
BlockCamは次のビジュアルをサポートしています。
現在、押し出し効果では次の形状がサポートされています(またはサポートされる予定です)。
| 形状 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい- SCNBox | Z軸に沿って長くなったネイティブボックスの形状。 |
| 三角形 | いいえ | カスタム正三角形の形状。 |
| 五角形 | いいえ | カスタム正五角形。 |
| 六角形 | いいえ | カスタム正六角形。 |
| オクトゴン | いいえ | カスタム正八角形。 |
| ピラミッド | はい- SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい- SCNTorus | ネイティブトーラス形状。 |
| シリンダー | はい- SCNCylinder | 自然なシリンダー形状-すてきな高架円になります。 |
| 球 | はい- SCNSphere | ネイティブの球形。 |
| カプセル | はい- SCNCapsule | ネイティブカプセルの形状。聞こえるほど面白くない。 |
| 四面体 | いいえ | カスタム正四面体ソリッド。 |
| 星 | いいえ | カスタム星形(半径方向に等しい頂点を持つ)。頂点の数を変えることができます。 |
| CombinedForRGB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| CombinedForHSB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| レター | はい- SCNText | ネイティブの押し出しテキスト。特に非ラテン系のアルファベットでは、非常に遅くなる傾向があります。 |
| 行 | はい- SCNCapsule | 非常に薄いカプセル形状。 |
| CappedLines | はい-組み合わせ | ユーザー設定に応じて、行の上部、中間、または下部に球体を配置した非常に薄いカプセル形状。 |
| RadiatingLines | はい-組み合わせ | 中心点から放射状に広がる複数の線。 ユーザーは行数を指定できます。 これはパフォーマンス重視の形状です。 |
代表的なピクセル化領域の各形状は、押し出しまたは拡大されます。押し出しの深さまたは拡大サイズの決定は、ピクセル化された領域の色に依存します。
| カラーチャンネル | 使用方法 |
|---|---|
| Matiz | 色の色相は、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の実行を中止する設定を使用できます。
| イベント | アクション | 設定の制御 |
|---|---|---|
| Térmico | サーマルイベントがクリティカルステージ(通知では文字通り.critical )に達すると、設定がtrueの場合、BlockCamによって作成される熱ストレスを減らす致命的なエラーが生成されます。 | .HaltWhenTooHot |
| バッテリー | バッテリーが低電力状態になった場合、設定がtrueの場合、再充電前にバッテリーの寿命を保つために致命的なエラーが生成されます。 | .HaltOnLowPower |
BlockCamの著作権©2019, 2020 by Stuart Rankin