Caméra en blocs 3D
BlockCam est un programme d'appareil photo pour iOS et iPados qui prend des images via AvFoundation, puis convertit ces images en scènes 3D simples. Les scènes peuvent être tournées et mises à l'échelle par l'utilisateur, et enregistrées comme une image plate.
Blockcam a été écrit par Stuart Rankin.
Le versioning de BlockCam est maintenu dans le fichier Versioning.swift et est automatiquement mis à jour avec chaque version comme étape de script avant construire. La mise à jour inclut les ID de construction, les numéros de construction, les heures et les dates, mais les numéros de version doivent actuellement être mis à jour à la main. La chaîne de construction actuelle ci-dessous est également maintenue par le même mécanisme.
Le programme de versioning ne met actuellement pas à jour les numéros de version du fichier du projet BlockCam.
Build le plus récent: Version 0.9 Alpha, Build 3287, Date de construction: 13 juillet 2021, 16:06
Voir le référentiel de versions VersionUpDater sur GitHub pour plus d'informations sur la façon dont les versions et les builds sont mis à jour.
BlockCam est conçu pour contenir autant que possible les informations fournies par l'utilisateur. Chaque fois que des informations identifiables par l'utilisateur sont utilisées, BlockCam le demandera explicitement. Par conception, BlockCam ne collecte aucune information identifiable par défaut par défaut; L'utilisateur doit prendre des mesures actives pour permettre la collecte de ce type d'informations.
| Informations identifiables | Utiliser | Stockage |
|---|---|---|
| Nom d'utilisateur | Le nom de l'utilisateur (entré par l'utilisateur) pour être stocké dans des métadonnées d'image traitées. | Stocké dans UserDefaults . |
| Copyright de l'utilisateur | La chaîne de copyright de l'utilisateur (entrée par l'utilisateur) pour être stockée dans des métadonnées d'image traitées. | Stocké dans UserDefaults . |
Lorsque l'utilisateur instancie BlockCam, il s'ouvre en mode View Live (affichant la vue de l'appareil photo sur l'écran principal). L'utilisateur a la possibilité de choisir l'un des trois modes:
BlockCam a été testé sur les plates-formes suivantes:
UIBezierPath pour ajouter plus de formes.Il y a quatre problèmes de performance pour BlockCAM:
autoreleasepool , la plupart des préoccupations ont été traitées. S'il s'avère que cela est insuffisant, un plan d'atténuation existe: enregistrer toutes les images à gratter vers le stockage local, puis les lire individuellement et les traiter une à la fois. Cela ralentira les choses mais réduira la pression de la mémoire. BlockCam convertit chaque image prise dans une image pixellée via le filtre CoreImage CIPixellate . Après la pixellation, l'algorithme de traitement calcule ensuite la hauteur déterminée - la hauteur détermine soit la taille d'un nœud ou l'extrusion d'un nœud. Ensuite, chaque pixel de l'image pixellée est converti en forme 3D (définie par l'utilisateur), puis ajoutée à la scène actuelle dans la vue 3D.
Toutes les opérations de traitement utilisent le même code mais peuvent être appelées différemment (ou plusieurs fois) en fonction du mode orienté utilisateur en effet.
Une image est acquise pour le traitement. La source de l'image n'est pas importante tant qu'elle est une image standard et lisible par iOS / iPados. La source d'images la plus courante sera très probablement l'appareil photo en direct. Les autres sources sont l'album photo et les cadres vidéo.
L'image suivante est la source du traitement. (C'est une image que j'ai prise de notre jardin au début de l'hiver.)

Compte tenu des frais de performance de la conversion de l'image, l'utilisateur a la possibilité de réduire la quantité de travail effectuée en faisant redimensionner l'image source en une taille plus petite. Cela peut également se produire sans l'intervention de l'utilisateur si les vidéos sont traitées. (Le traitement des vidéos a tendance à prendre beaucoup de mémoire, donc même enregistrer quelques pour cent par image aidera à garder les choses moins stressantes sur le système.) Certaines images sont également tournées à 270 ° (ou -90 ° si vous préférez) et doivent être tournées correctement. Cela se fait également dans l'étape de conditionnement de l'image.
L'image traitée est ensuite pixellée via des fonctions de filtre d'image centrale. Plus précisément, le filtre BlockCam le plus courant utilise est CIPixellate (bien que d'autres filtres à pixellation soient utilisés en fonction de la forme finale). La taille de chaque région pixellée dépend des paramètres utilisateur. Plus la taille est petite, plus l'impact sur les performances globales est grand, bien que CIPixellate (et comme les filtres) soit encore très rapide. La raison pour laquelle les régions pixellaties plus petites augmentent les performances est due au fait que davantage de nœuds 3D seront nécessaires plus tard.
L'image suivante montre la pixellation de l'image d'origine. Notez que chaque région pixellée est une couleur unie, ce qui signifie que BlockCam n'a pas à lire toute la région pour obtenir la couleur - juste un pixel.

L'image pixellée est ensuite analysée. Cela implique d'obtenir la couleur de chaque région pixellée. Il s'agit d'une étape plus lente que prévu. Obtenir des données de pixels individuelles à partir d'une image nécessite une grande manipulation de données d'image juste pour préparer l'image à être interrogée. À la fin de cette étape, les images ne sont plus utilisées. Un tableau 2D de données de couleur est passé à l'étape suivante.
À cette étape, les données d'image Pixellated sont enregistrées sur le stockage de fichiers local. Il s'agit de simplifier les modifications visuelles mineures demandées plus tard par l'utilisateur.
La forme du nœud final est un paramètre utilisateur. BlockCam permet aux utilisateurs de sélectionner parmi l'une des nombreuses formes - les formes intégrées ont tendance à fonctionner plus rapidement que les formes non construites (par exemple, les sphères sont plus rapides que les pentagons). Un nœud 3D est généré pour chaque couleur à partir de l'étape d'analyse d'image en utilisant la géométrie spécifiée. Afin de montrer la 3D-ness de la scène finale, les nœuds sont exagérés dans une certaine dimension. Par exemple, si les cubes sont la forme sélectionnée par l'utilisateur, la longueur sera exagérée. L'exagération est déterminée par la couleur - la couleur est utilisée pour ombrer la surface diffuse du nœud ainsi que pour déterminer la hauteur. L'exagération est déterminée par un déterminant sélectionnable par l'utilisateur:
Une fois qu'un nœud a été créé, il est ajouté à un nœud maître. Une fois que tous les nœuds ont été créés et placés dans le nœud maître, le nœud maître lui-même est placé dans la scène 3D.
Bien que cela puisse sembler une étape triviale, c'est très délicat lors de la conversion de vidéos. Si la conversion d'une image, tout ce qui se passe, c'est que la scène 3D est mise à jour et finalement affichée à l'utilisateur (généralement à 0,5 à 2,0 secondes). Pour les vidéos, il est essentiel d'obtenir le moment de l'écran correctement: pour convertir une vidéo, chaque trame est exécutée à travers ces étapes, puis un instantané est pris de la scène 3D. Si l'instantané est pris avant que la scène ne soit affichée, le résultat sera une image noire pure, ce qui n'est pas ce que l'utilisateur veut voir. Par conséquent, BlockCam doit participer à l'ensemble de fonctions SCNSceneRendererDelegate pour savoir quand une scène est réellement visible pour l'utilisateur.
L'image suivante est la version finale et traitée de l'image. Il s'agit de la sortie d'un appel snapshot() sur le scnview. L'échantillon utilise des blocs extrudés et est affiché dans l'orientation par défaut de la caméra.

Une fois l'image affichée, l'utilisateur a la possibilité de l'enregistrer tel quel ou de modifier certains aspects visuels ou de tourner ou de zoomer ou de sortir, puis de l'enregistrer (encore une fois, peut-être). Pour les vidéos, une fois qu'un instantané de la scène 3D est capturé, la scène est éliminée.
Selon la valeur de .SaveOriginalImageAction , l'image d'origine sera enregistrée. Lorsque l'utilisateur enregistre l'image traitée, les métadonnées sont enregistrées avec l'image traitée. Les métadonnées se compose du nom et de la version du programme ainsi que des paramètres en vigueur lorsque l'image a été créée.
Enregistrer les fichiers traités est un processus en plusieurs étapes:
/Scratch en tant que fichier .jpg standard..jpg ).PHAssetCreationRequest avec les paramètres appropriés définis - ceci est nécessaire car la méthode la plus courante pour déplacer les images vers les données de plis Photo Roll EXIF)./Scratch .BlockCam enregistre les métadonnées dans les fichiers traités.
| Groupe | Étiqueter | Valeurs stockées |
|---|---|---|
| Tiff | Artiste | S'il est activé par l'utilisateur, le nom de l'utilisateur. |
| Tiff | Droit d'auteur | S'il est activé par l'utilisateur, la chaîne de copyright de l'utilisateur. |
| Tiff | Logiciel | Nom, version et numéros de construction de BlockCam. |
| Exif | Utilisateur | Liste des paramètres utilisés pour générer l'image traitée. |
Voir également la discussion sur la confidentialité.
Un diagramme d'écoulement simplifié pour le traitement d'image est illustré ci-dessous.

En raison du temps nécessaire pour prétraiter et pixellé une image, chaque fois qu'une nouvelle image est traitée, les données de pixellation (consistant en un tableau de couleurs) est enregistrée dans le système de fichiers de l'appareil. Si l'utilisateur modifie alors un paramètre (comme une forme 3D), le prétraitement a déjà été terminé et les données de pixellation sont réutilisées. Cela peut potentiellement économiser beaucoup de temps.
Si l'utilisateur modifie un paramètre qui affecte le prétraitement, l'image est retraitée depuis le début. (Par exemple, la modification de la taille du bloc entraînera l'exécution d'un cycle de retraitement complet.)
Un diagramme d'écoulement simplifié pour le traitement vidéo est illustré ci-dessous. Le cube fait référence au flux d'image.

Actuellement, la boîte verte («trame traitée») ne fonctionne pas comme prévu / requise, de sorte que la rédaction actuelle, la création de vidéos n'est pas prise en charge.
BlockCam Logs Messages et statut à l'exécution vers la console de débogage (s'il est présent, et dans la grande majorité des instances, cela ne sera pas présent) et vers une base de données SQLite locale. Cela permet le débogage post-mortem si le besoin est de subir.
Compte tenu de la politique d'Apple sur la location de données (sans parler des politiques de l'UE), il est tout à fait probable que la journalisation sera supprimée (via des drapeaux de compilation) pour toute version publiée de BlockCam.
Tous les paramètres utilisateur (et quelques paramètres de processus) sont stockés via la classe Settings . Cette classe résume un mécanisme de stockage invisible pour le reste du programme. Actuellement, le mécanisme de stockage est UserDefaults . Si les paramètres deviennent plus complexes, il est simple de migrer cela vers une base de données.
Pour accéder aux paramètres, les appelants doivent utiliser les méthodes fournies de la classe Settings . Cela permet d'assurer l'intégrité du type de données.
La classe Settings fournit également la notification au niveau des paramètres des modifications (ce qui était la principale raison de créer la classe en premier lieu).
Les paramètres de BlockCam sont présentés ci-dessous.
| Symbole | Taper | Défaut | Usage |
|---|---|---|---|
| .Initialized | Chaîne | "Initialisé" | Indicateur qui détermine si les paramètres ont été initialisés ou non. Lorsque BlockCam s'exécute pour la première fois, si .Initialized est nul ou vide, il suppose que c'est la première fois que BlockCam est exécuté et écrit donc des valeurs par défaut pour tous les paramètres. |
| . | Entier | 48 | Taille du bloc pour le traitement d'image. Il s'agit de la taille carrée de chaque région pixellée. |
| . | Chaîne | "Blocs" | Le même de l'objet 3D à chaque région de pixellation. Coulé à partir d'une énumération. |
| .Invertheight | Booléen | FAUX | Le drapeau de détermination de la hauteur / taille inversée. |
| .Heightsource | Chaîne | "Luminosité" | Le canal de couleur à utiliser pour déterminer la hauteur / la taille. Coulé à partir d'une énumération. |
| .Imagesiseconstraints | Chaîne | "Moyen" | Détermine la quantité de réduction de la taille de l'image à faire avant de la traiter pour des raisons de performance. Coulé à partir d'une énumération. Valeur réelle interprétée au moment de l'exécution. |
| .VerticalExagération | Chaîne | "Moyen" | La quantité d'exagération verticale à effectuer lors de l'extrudage ou de l'élargissement des formes 3D. Coulé à partir d'une énumération. |
| .Inputquality | Entier | 2 | Valeur qui indique la qualité d'entrée. Varie de 0 à 3 avec 3 étant la plus haute qualité (et le plus lent à traiter). |
| .CurrentCamera | Chaîne | "Dos" | La position de la dernière caméra utilisée. Avant ou arrière. Coulé à partir d'une énumération. |
| .LightColor | Chaîne | "Blanc" | Nom de la couleur de la lumière. Coulé à partir d'une énumération. Peut être converti en couleur de bibliothèque de couleurs plus tard. |
| .LightType | Chaîne | "Omni" | Nom du type de lumière utilisé pour éclairer la scène. Coulé à partir d'une énumération. |
| .Intensité de la lumière | Chaîne | "Normale" | Intensité de la lumière utilisée pour éclairer la scène. Valeur réelle déterminée au moment de l'exécution. Coulé à partir d'une énumération. |
| .FieldOfView | Chaîne | "Normale" | Champ de vision de la caméra. La valeur réelle est déterminée au moment de l'exécution. Coulé à partir d'une énumération. |
| .Showhistogramme | Booléen | FAUX | Afficher l'affichage de l'histogramme. Pas actuellement implémenté. |
| .Histogrambucketcount | Entier | 256 | Nombre de couleurs dans l'affichage de l'histogramme. Pas actuellement implémenté. |
| .InitialView | Chaîne | "LiveView" | La dernière vue vue par l'utilisateur (comme la vue en direct, les albums, etc.). |
| .Extrudelettes. | Booléen | vrai | Détermine si les lettres sont entièrement extrudées ou seulement partiellement extrudées. |
| . | Chaîne | "Lisse" | Détermine à quel point la création de courbes en lettres en douceur. Des courbes de haute qualité ont un coût de performance important. Valeur réelle déterminée au moment de l'exécution. Coulé à partir d'une énumération. |
| .Letterfont | Chaîne | "Futura" | La police (et le poids facultatif) à utiliser pour rendre des lettres extrudées. Si la police n'existe pas sur le système, BlockCam entrera dans un état non défini. |
| .RandomCharactersource | Chaîne | "Latin" | Nommé Unicode Plage de caractères à utiliser comme source de lettres aléatoires lors de l'extrudage des caractères. Plusieurs gammes peuvent être spécifiées en séparant chacune des autres avec une virgule. |
| .Videofps | Entier | 1 | Pas actuellement utilisé. |
| .Videodimensions | Chaîne | "Le plus petit" | Détermine la taille de la vidéo finale lors de la génération de vidéo. Valeur réelle déterminée au moment de l'exécution. Coulé à partir d'une énumération. |
| .VideoblockSize | Entier | 48 | Taille du bloc pour le traitement vidéo. Il s'agit de la taille carrée de chaque région pixellée. |
| .Umétal | Booléen | vrai | Flag qui indique à BlockCam d'utiliser du métal plutôt qu'OpenGL. |
| .AntialiasingMode | Entier | 0 | Détermine le mode antialiasing. |
| .InitialBestFit | Booléen | FAUX | Si elle est vraie, BlockCam essaiera d'adapter tous les nœuds dans la vue avec aussi étroitement que possible. |
| .SaveoriginalImageAction | Chaîne | "Toujours" | Détermine comment et quand enregistrer des images originales. Coulé à partir d'une énumération. |
| .Next SesencentialInteger | Entier | 0 | Utilisé pour la génération de noms de fichiers. |
| .LooponsentialIntegerafter | Entier | 9999 | Détermine quand boucle au début lors de l'utilisation d'entiers séquentiels. |
| .STARTERSELENTALINTERATAT | Entier | 1 | Valeur de démarrage pour les entiers séquentiels. |
| . | Booléen | FAUX | Si c'est vrai, le nombre d'apex pour les formes d'étoiles augmente avec l'importance de la hauteur de la couleur. |
| .StarapExcount | Entier | 5 | Nombre de sommets pour les étoiles. Si .IncreaseStarApexesWithProminence |
| . | Booléen | vrai | S'il est vrai, BlockCam s'arrête (via un appel fatalError ) lorsqu'il reçoit une alerte thermique critique. Cela peut violer les directives d'Apple et peut être supprimée. |
| .HaltonlowPower | Booléen | vrai | Si elle est vraie, BlockCam s'arrête (via un appel fatalError ) lorsqu'il reçoit une alerte à faible puissance. Cela peut violer les directives d'Apple et peut être supprimée. |
| .BestFitOffset | Double | 2.0 | Valeur à utiliser pour soutenir la caméra lorsque .InitialBestFit est vrai pour donner un peu plus d'espace négatif à l'image. |
| .LightingModel | Chaîne | "Phong" | Modèle d'éclairage du matériau de surface. Coulé à partir d'une énumération. |
| .CappageLoBlocation | Chaîne | "Haut" | Emplacement de la balle ("Cap") pour les nœuds en forme de ligne de plafond. Coulé à partir d'une énumération. |
| .LoggingEnabled | Booléen | FAUX | Activer le drapeau de journalisation. |
| . | Entier | 36 | La taille de la police pour les lettres extrudées. |
| .EnableUisounds | Booléen | vrai | Flag pour jouer des sons d'interface utilisateur (comme lorsqu'un bouton est enfoncé). Si cette valeur est false , tous les autres drapeaux sonores sont ignorés. |
| . | Booléen | FAUX | Faculter pour jouer un son d'obturation lorsque le bouton de l'appareil photo est enfoncé. Dans certains endroits géographiques, cela se produit toujours et la définition de cette valeur n'aura aucun effet. |
| .EnableImageProcessingSound | Booléen | vrai | Flag pour jouer un son au début et à la fin du traitement d'image. Étant donné que le traitement d'image prend du temps, cela aide l'utilisateur à comprendre quand l'image est terminée. |
| .EnablevideOrordingSound | Booléen | vrai | Flag pour lire un son lorsque l'utilisateur démarre et arrête d'enregistrer une vidéo. |
| .Enablebuttonpresssounds | Booléen | vrai | Indicateur pour lire un son lorsque l'utilisateur appuie sur les boutons. |
| .EnableOptionSelectsounds | Booléen | vrai | Indicateur pour lire un son lorsque l'utilisateur sélectionne une option dans l'affichage des paramètres à l'écran. |
| . | Booléen | FAUX | Flag pour jouer un son lorsqu'une boîte de dialogue Crash est affichée. Activé uniquement lorsqu'il est compilé en mode #debug . |
| .Meshdotsize | Chaîne | "Moyen" | Taille du point central pour les mailles. Si .None Aucun n'est utilisé, aucun point central ne sera affiché. Coulé à partir d'une énumération. |
| .MeshlineThickness | Chaîne | "Moyen" | Épaisseur des lignes de maillage. Coulé à partir d'une énumération. |
| .RadiatetingLineThickness | Chaîne | "Moyen" | Épaisseur des formes de ligne rayonnantes. Coulé à partir d'une énumération. |
| .RadiantlineCount | Entier | 8 | Nombre de lignes rayonnantes en forme de ligne rayonnante. 4 est destiné aux lignes pointant vers les directions cardinales, 8 pour les directions cardinales et entre les deux, et 16 pour 8 lignées supplémentaires dans le plan Z. |
| .Blockchamfersize | Chaîne | "Aucun" | Le rayon de chanfrein / lisse de bord pour les formes de bloc. Coulé à partir d'une énumération. |
| .MaxiMagedimension | Entier | 1024 | Dimension maximale d'une image. Si une image à traiter est plus grande, elle sera redimensionnée de telle sorte que la dimension la plus longue est cette valeur. |
| .AdduserDatatoExif | Booléen | FAUX | Indicateur pour ajouter des informations créées par l'utilisateur au bloc EXIF des images traitées. Si elle est compilée en mode #debug, cette valeur est par défaut true. |
| .Nom d'utilisateur | Chaîne | "" | (La valeur par défaut est vide.) Le nom fourni par l'utilisateur qui est ajouté au bloc EXIF des images traités. Cela ne se produit que si .AddUserDataToExif est vrai. Si elle est compilée en mode #debug, cette valeur est par défaut "Stuart Rankin". |
| .UserCopyright | Chaîne | "" | (La valeur par défaut est vide.) La chaîne de copyright fournie par l'utilisateur qui est ajoutée au bloc EXIF des images traitées. Cela ne se produit que si .AddUserDataToExif est vrai. Si elle est compilée en mode #debug, cette valeur est par défaut "Attribution 3.0 Unportted (CC by 3.0)". |
| .ConiSinverted | Booléen | vrai | Détermine si les formes de cône sont inversées en termes de profondeur z. |
| .Conetopoptions | Chaîne | .TopIsZero .RawValue | Options pour déterminer le rayon supérieur du cône. |
| .Conebaseoptions | Chaîne | .BaseIsSide .RawValue | Options pour déterminer le rayon de base du cône. |
| .Showsplashscreen | Booléen | vrai | Flag qui détermine si l'écran des éclaboussures est affiché au démarrage ou non. |
| .Hueshapelist | Chaîne | "" | Liste des formes pour le type de forme des variantes de teinte. |
| .Saturationshapelist | Chaîne | "" | Liste des formes pour le type de forme de la variante de saturation. |
| .Brightnesshapelist | Chaîne | "" | Liste des formes pour le type de forme de la variante de luminosité. |
BlockCam utilise le traitement 3D, qui exerce la puce graphique de l'appareil. Si l'utilisateur spécifie des paramètres de la plus haute qualité, il est possible que certaines conditions extrêmes se produisent. Pour aider à préserver l'appareil à partir de dégâts, des paramètres sont disponibles pour abandonner l'exécution de BlockCam lorsque cela se produit.
| Événement | Action | Réglage de contrôle |
|---|---|---|
| Thermique | Si un événement thermique atteint l'étape critique (littéralement .critical dans la notification), si le réglage est true , une erreur mortelle sera générée pour réduire toute contrainte thermique créée par BlockCam. | .HaltWhenTooHot |
| Batterie | Si la batterie entre dans un état de faible puissance, si le réglage est true , une erreur mortelle sera générée pour aider à préserver la durée de vie de la batterie avant de recharger. | .HaltOnLowPower |
BlockCam prend en charge les visuels suivants:
Les formes suivantes sont actuellement prises en charge (ou prévues pour être prises en charge) pour les effets d'extrusion:
| Forme | Indigène | Notes |
|---|---|---|
| Blocs | Oui - SCNBox | Les formes de boîte indigène allongées le long de l'axe z. |
| Triangles | Non | Formes de triangle équilatérale personnalisées. |
| Pentagones | Non | Formes de pentagone équilatérales personnalisées. |
| Hexagones | Non | Formes hexagonales équilatérales personnalisées. |
| Octogons | Non | Formes octogonales équilatérales personnalisées. |
| Pyramides | Oui - SCNPyramid | Formes de pyramides indigènes. |
| Toroïdes | Oui - SCNTorus | Formes de tore indigènes. |
| Cylindres | Oui - SCNCylinder | Formes de cylindre indigènes - Connecte de beaux cercles surélevés. |
| Sphères | Oui - SCNSphere | Formes de sphères indigènes. |
| Capsules | Oui - SCNCapsule | Formes de capsule indigène. Pas aussi intéressant qu'ils paraissent. |
| Tétraèdres | Non | Solide de tétraèdre équilatéral personnalisé. |
| Étoiles | Non | Formes d'étoiles personnalisées (avec des sommets radialement égaux). Peut varier le nombre d'apex. |
| Combinés | Oui - combinaison | Sphère, tore et capsule combinées. |
| Combiné pour | Oui - combinaison | Sphère, tore et capsule combinées. |
| Maillot | Non | Pas actuellement implémenté. |
| Courrier | Oui - SCNText | Texte extrudé natif. A tendance à être extraordinairement lente, en particulier avec les alphabets non latins. |
| Lignes | Oui - SCNCapsule | Forme de capsule très fine. |
| Lignes de casse | Oui - combinaison | Forme de capsule très mince avec une sphère placée en haut, au milieu ou au bas de la ligne en fonction des paramètres de l'utilisateur. |
| Lignes de rayonnage | Oui - combinaison | Plusieurs lignes rayonnant du point central. L'utilisateur peut spécifier le nombre de lignes. Ceci est une forme lourde des performances. |
| Talonner | variantes | La forme à un point donné est déterminée par la teinte de la région pixellée, de sorte que la forme finale réelle variera. |
| Saturation | variantes | La forme à un point donné est déterminée par la saturation de la région pixellée, de sorte que la forme finale réelle variera. |
| Luminosité | variantes | La forme à un point donné est déterminée par la luminosité de la région pixellée, de sorte que la forme finale réelle variera. |
Chaque forme pour une région pixellée représentative est extrudée ou agrandie. La détermination de la profondeur d'extrusion ou de la taille agrandie dépend de la couleur de la région pixellée.
| Canal de couleur | Usage |
|---|---|
| Teinte | La teinte de la couleur détermine la profondeur / taille de l'objet 3D. Notez que les valeurs de teinte sont cycliques (0,0 étant essentiellement les mêmes que 1,0), les pixels rougeâtres ont donc tendance à être modérés tandis que le vert est mis en évidence. |
| Saturation | La valeur de saturation des couleurs détermine la profondeur / taille. Des couleurs plus vives seront plus grandes. |
| Luminosité | La luminosité de la couleur détermine la profondeur / taille. Il s'agit de la valeur par défaut et de la façon dont la plupart des gens s'attendraient à ce que le programme fonctionne. |
| Rouge | Le canal rouge est utilisé pour déterminer la profondeur / taille. |
| Vert | Le canal vert est utilisé pour déterminer la profondeur / taille. |
| Bleu | Le canal bleu est utilisé pour déterminer la profondeur / taille. |
| Cyan | Un canal cyan synthétique (à partir de CMYK) est utilisé pour déterminer la profondeur / la taille. |
| Magenta | Un canal magenta synthétique (à partir de CMYK) est utilisé pour déterminer la profondeur / la taille. |
| Jaune | Un canal jaune synthétique (à partir de CMYK) est utilisé pour déterminer la profondeur / la taille. |
| Noir | Un canal noir synthétique (à partir de CMYK) est utilisé pour déterminer la profondeur / la taille. |
| Yuv: y | Le canal Y synthétique à partir d'une conversion YUV. |
| Yuv: u | Le canal U synthétique à partir d'une conversion YUV. |
| Yuv: V | Le canal V synthétique à partir d'une conversion YUV. |
BlockCam prend en charge un drapeau inversé. Cela signifie que si les utilisateurs désemblent inversé, la profondeur / la taille est un réciproque de lui-même, ce qui rend les zones sombres proéminentes et les zones légères modérées ou cachées.
BlockCam prend en charge la modification de la couleur de la lumière ainsi que le type de lumière. Les couleurs sont actuellement limitées à un petit ensemble de couleurs prédéfinies. Les types de lumières parallèles des lumières standard non paramétisées de Scenekit parallèles (telles que .omni et .spot ).
La position de la lumière n'est pas actuellement réglable par l'utilisateur.
BlockCam utilise l'indicateur SCNView allowsCameraControl pour permettre à l'utilisateur d'agrandir, de se faire tourner ou de tourner (en trois axes) par voie de gestes.
Lorsqu'il est initialement rendu, le résultat peut sembler relativement loin de la vue. BlockCam a un drapeau sédable de l'utilisateur pour ajuster l'image à la vue. Cette caractéristique a tendance à confondre allowsCameraControl en ce qui concerne l'agrandissement et le rétrécissement.
Cette section discutera de divers détails au niveau de la mise en œuvre.
BlockCam a été écrit dans Swift 5 avec Xcode 11.3.
Compte tenu du long temps qu'il faut pour traiter les images, tout le traitement d'image est effectué sur un thread d'arrière-plan. Cela nécessite que toutes les communications mettent à jour l'utilisateur via l'interface utilisateur à effectuer avec les appels de threading appropriés.
TBD
BlockCam est Copyright © 2019, 2020 par 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 | Chaîne | "Initialized" | 設定が初期化されたかどうかを決定するフラグ。 BlockCamが最初に実行されるときに、 .Initializedがnilまたは空の場合、BlockCamが最初に実行されたと想定されるため、すべての設定のデフォルト値を書き込みます。 |
| .BlockSize | 整数 | 48 | 画像処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .ShapeType | Chaîne | "Blocks" | 各ピクセル化領域の3Dオブジェクトと同じ。列挙型からキャストします。 |
| .InvertHeight | Booléen | FAUX | 反転高さ/サイズ決定フラグ。 |
| .HeightSource | Chaîne | "Luminosité" | 高さ/サイズを決定するために使用するカラーチャンネル。列挙型からキャストします。 |
| .ImageSizeConstraints | Chaîne | "Moyen" | パフォーマンス上の理由から、処理する前に行う画像のサイズの縮小量を決定します。列挙型からキャストします。実行時に解釈される実際の値。 |
| .VerticalExaggeration | Chaîne | "Moyen" | 3D形状を押し出しまたは拡大するときに実行する垂直方向の誇張の量。列挙型からキャストします。 |
| .InputQuality | Entier | 2 | 入力品質を示す値。 0から3の範囲で、3が最高品質(および処理が最も遅い)です。 |
| .CurrentCamera | Chaîne | "Dos" | 最後に使用したカメラの位置。前面または背面。列挙型からキャストします。 |
| .LightColor | Chaîne | "Blanc" | ライトの色の名前。列挙型からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .LightType | Chaîne | "Omni" | シーンの照明に使用されるライトのタイプの名前。列挙型からキャストします。 |
| .LightIntensity | Chaîne | "Normale" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙型からキャストします。 |
| .FieldOfView | Chaîne | "Normale" | カメラの視野。実際の値は実行時に決定されます。列挙型からキャストします。 |
| .ShowHistogram | Booléen | FAUX | ヒストグラム表示を表示します。現在実装されていません。 |
| .HistogramBucketCount | 整数 | 256 | ヒストグラム表示の色数。現在実装されていません。 |
| .InitialView | Chaîne | "LiveView" | ユーザーが最後に表示したビュー(ライブビュー、アルバムなど)。 |
| .FullyExtrudeLetters | Booléen | vrai | 文字が完全に押し出されるか、部分的にのみ押し出されるかを決定します。 |
| .LetterSmoothness | Chaîne | "Lisse" | 文字の曲線をどれだけスムーズに作成するかを決定します。高品質の曲線には、大きなパフォーマンスコストがかかります。実行時に決定される実際の値。列挙型からキャストします。 |
| .LetterFont | Chaîne | "Futura" | 押し出された文字のレンダリングに使用するフォント(およびオプションの太さ)。フォントがシステムに存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | Chaîne | "Latin" | 文字を押し出すときにランダムな文字のソースとして使用する名前付きUnicode範囲。複数の範囲を指定するには、それぞれをコンマで区切ります。 |
| .VideoFPS | 整数 | 1 | 現在使用されていません。 |
| .VideoDimensions | Chaîne | "Smallest" | ビデオを生成するときの最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙型からキャストします。 |
| .VideoBlockSize | 整数 | 48 | ビデオ処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .UseMetal | Booléen | vrai | OpenGLではなくMetalを使用するようにBlockCamに指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチエイリアスモードを決定します。 |
| .InitialBestFit | Booléen | FAUX | trueの場合、BlockCamは、すべてのノードをビューにできるだけ厳密に合わせようとします。 |
| .SaveOriginalImageAction | Chaîne | "Toujours" | 元の画像を保存する方法とタイミングを決定します。列挙型からキャストします。 |
| .NextSequentialInteger | Entier | 0 | ファイル名の生成に使用。 |
| .LoopSequentialIntegerAfter | Entier | 9999 | 連続する整数を使用する場合、いつループを開始するかを決定します。 |
| .StartSequentialIntegerAt | Entier | 1 | 連続整数の開始値。 |
| .IncreaseStarApexesWithProminence | Booléen | FAUX | trueの場合、星形の頂点の数は色の高さが顕著になるにつれて増加します。 |
| .StarApexCount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceがtrueの場合、これは頂点の開始数です。 |
| .HaltWhenCriticalThermal | Booléen | vrai | trueの場合、BlockCamは重大な温度アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .HaltOnLowPower | Booléen | vrai | trueの場合、BlockCamは低電力アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .BestFitOffset | Double | 2.0 | .InitialBestFitがtrueの場合にカメラを後退させて、画像にもう少しネガティブなスペースを与えるために使用する値。 |
| .LightingModel | Chaîne | "Phong" | 表面マテリアル照明モデル。列挙型からキャストします。 |
| .CappedLineBallLocation | Chaîne | "Haut" | CappedLine形状のノードのボール(「キャップ」)の位置。列挙型からキャストします。 |
| .LoggingEnabled | Booléen | FAUX | ロギングフラグを有効にします。 |
| .FontSize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .EnableUISounds | Booléen | vrai | Flagは、UIサウンドを再生します(ボタンが押されたときなど)。 この値が「false」の場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | Booléen | FAUX | Flagは、カメラボタンが押されたときにシャッター音を再生します。 一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .EnableImageProcessingSound | Booléen | vrai | Flagは、画像処理の開始時と終了時に音声を再生します。 画像処理には時間がかかるため、ユーザーは画像がいつ完成するかを理解するのに役立ちます。 |
| .EnableVideoRecordingSound | Booléen | vrai | ユーザーがビデオの記録を開始および停止したときに音を再生するフラグ。 |
| .EnableButtonPressSounds | Booléen | vrai | ユーザーがボタンを押したときに音を再生するフラグ。 |
| .EnableOptionSelectSounds | Booléen | vrai | ユーザーが画面上の設定画面でオプションを選択したときに音を再生するフラグ。 |
| .EnableCrashSounds | Booléen | FAUX | フラグは、クラッシュダイアログが表示されたときにサウンドを再生します。 #DEBUGモードでコンパイルされた場合のみ有効です。 |
| .MeshDotSize | Chaîne | "Moyen" | メッシュの中心ドットのサイズ。 .Noneが使用される場合、中央のドットは表示されません。 列挙型からキャストします。 |
| .MeshLineThickness | Chaîne | "Moyen" | メッシュラインの太さ。 列挙型からキャストします。 |
| .RadiatingLineThickness | Chaîne | "Moyen" | 放射線形状の太さ。 列挙型からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射ライン形状の放射ラインの数。 「4」は基線方向を指す線、「8」は基線方向とその中間、および「16」はz平面のさらに8本の線を示します。 |
| .BlockChamferSize | Chaîne | "Aucun" | ブロック形状の面取り半径/エッジの滑らかさ。 列挙型からキャストします。 |
| .MaxImageDimension | 整数 | 1024 | 画像の最大寸法。 処理する画像が大きい場合、最長寸法がこの値になるようにサイズ変更されます。 |
| .AddUserDataToExif | Booléen | FAUX | Flagは、ユーザーが作成した情報を処理済み画像のExifブロックに追加します。 |
| .Nom d'utilisateur | Chaîne | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の名前。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します。 |
| .UserCopyright | Chaîne | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の著作権文字列。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します |
BlockCamは次のビジュアルをサポートしています。
現在、押し出し効果では次の形状がサポートされています(またはサポートされる予定です)。
| 形状 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい- SCNBox | Z軸に沿って長くなったネイティブボックスの形状。 |
| 三角形 | いいえ | カスタム正三角形の形状。 |
| 五角形 | いいえ | カスタム正五角形。 |
| 六角形 | いいえ | カスタム正六角形。 |
| オクトゴン | いいえ | カスタム正八角形。 |
| ピラミッド | はい- SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい- SCNTorus | ネイティブトーラス形状。 |
| シリンダー | はい- SCNCylinder | 自然なシリンダー形状-すてきな高架円になります。 |
| 球 | はい- SCNSphere | ネイティブの球形。 |
| カプセル | はい- SCNCapsule | ネイティブカプセルの形状。聞こえるほど面白くない。 |
| 四面体 | いいえ | カスタム正四面体ソリッド。 |
| 星 | いいえ | カスタム星形(半径方向に等しい頂点を持つ)。頂点の数を変えることができます。 |
| CombinedForRGB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| CombinedForHSB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| レター | はい- SCNText | ネイティブの押し出しテキスト。特に非ラテン系のアルファベットでは、非常に遅くなる傾向があります。 |
| 行 | はい- SCNCapsule | 非常に薄いカプセル形状。 |
| CappedLines | はい-組み合わせ | ユーザー設定に応じて、行の上部、中間、または下部に球体を配置した非常に薄いカプセル形状。 |
| RadiatingLines | はい-組み合わせ | 中心点から放射状に広がる複数の線。 ユーザーは行数を指定できます。 これはパフォーマンス重視の形状です。 |
代表的なピクセル化領域の各形状は、押し出しまたは拡大されます。押し出しの深さまたは拡大サイズの決定は、ピクセル化された領域の色に依存します。
| カラーチャンネル | 使用方法 |
|---|---|
| Teinte | 色の色相は、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の実行を中止する設定を使用できます。
| イベント | アクション | 設定の制御 |
|---|---|---|
| Thermique | サーマルイベントがクリティカルステージ(通知では文字通り.critical )に達すると、設定がtrueの場合、BlockCamによって作成される熱ストレスを減らす致命的なエラーが生成されます。 | .HaltWhenTooHot |
| バッテリー | バッテリーが低電力状態になった場合、設定がtrueの場合、再充電前にバッテリーの寿命を保つために致命的なエラーが生成されます。 | .HaltOnLowPower |
BlockCamの著作権©2019, 2020 by Stuart Rankin