3D -блок камера
Blockcam - это программа камеры для iOS и iPados, которая принимает изображения через AvFoundation, а затем преобразует эти изображения в простые трехмерные сцены. Сцены могут быть повернуты и масштабированы пользователем и сохраняются как плоское изображение.
Блокмеда была написана Стюартом Ранкином.
Обращение к версии для Blockcam поддерживается в файле Versioning.swift и автоматически обновляется с каждой сборкой в качестве шага сценария перед сценарием. Обновление включает в себя идентификаторы сборки, номера сборки, время и даты, но номера версий в настоящее время должны быть обновлены вручную. Нынешняя строка из строительства ниже также поддерживается тем же механизмом.
Программа обмена версиями в настоящее время не обновляет номера версий файла проекта Blockcam.
Самая последняя сборка: версия 0.9 Альфа, сборка 3287, Дата сборки: 13 июля 2021 г., 16:06
См. Репозиторий версии versionupdater на GitHub для получения информации о том, как обновляются версии и сборки.
Blockcam предназначена для того, чтобы содержать пользовательную информацию как можно больше. В любое время, идентифицируемая пользователем, информация используется, Blockcam будет четко запрашивать ее. По дизайну, Blockcam не собирает никакой идентифицируемой пользователем информации по умолчанию; Пользователь должен предпринять активные шаги, чтобы разрешить сбор информации этого типа.
| Идентифицируемая информация | Использовать | Хранилище |
|---|---|---|
| Имя пользователя | Имя пользователя (введенное пользователем) для сохранения в обработанных метаданных изображениях. | Хранятся в UserDefaults . |
| Пользовательский авторский право | Строка авторского права пользователя (введенная пользователем) для сохранения в обработанных метаданных изображениях. | Хранятся в UserDefaults . |
Когда пользователь создает интенсивную блокировку, он открывается в режиме живого просмотра (показывая вид камеры на главном экране). У пользователя есть возможность выбрать один из трех режимов:
Blockcam была протестирована на следующих платформах:
UIBezierPath , чтобы добавить больше форм.У Blockcam есть четыре проблемы с производительностью:
autoreleasepool , большинство проблем были рассмотрены. Если оказывается, что это недостаточно, существует план смягчения: сохраните все изображения с нуля в локальное хранилище, затем прочитайте их по отдельности и обрабатывайте их по одному. Это замедлит ситуацию, но снизит давление в памяти. Blockcam преобразует каждое изображение, которое принимается в пикселированное изображение через фильтр coreimage CIPixellate . После пикселя алгоритм обработки вычисляет определение высоты - высота определяет либо размер узла, либо экструзию узла. Затем каждый пиксель из пикселированного изображения преобразуется в 3D -форму (установленную пользователем), а затем добавляется в текущую сцену в 3D -представлении.
Все операции обработки используют один и тот же код, но могут называться по-разному (или несколько раз) в зависимости от режима, ориентированного на пользователя.
Изображение получено для обработки. Источник изображения не важен, пока это стандартное изображение iOS/iPados. Наиболее распространенным источником изображений, скорее всего, будет камера Live View. Другими источниками являются фотоальбом и видео кадры.
Следующее изображение является источником обработки. (Это изображение, которое я сделал в нашем саду в начале зимы.)

Учитывая расходы на производительность на преобразование изображения, пользователь имеет возможность уменьшить объем работы, выполняемую путем изменения источника изображения до меньшего размера. Это также может произойти без вмешательства пользователя, которые должны быть обработаны. (Обработка видео имеет тенденцию использовать много памяти, поэтому даже экономия на несколько процентов на изображение поможет сохранить ситуацию менее напряженной в системе.) Некоторые изображения также повернуты на 270 ° (или -90 °, если вы предпочитаете), и их нужно правильно повернуть. Это также сделано на этапе кондиционирования изображения.
Обработанное изображение затем пикселитируется с помощью функций фильтра ядра. В частности, наиболее распространенным использованием фильтровальной блокировки является CIPixellate (хотя используются другие фильтры для пикселей в зависимости от конечной формы). Размер каждой пикселированной области зависит от настройки пользователя. Чем меньше размер, тем больше влияние на общую производительность, хотя CIPixellate (и, как и фильтры, все еще очень быстро. Причина, по которой меньшие пикселированные регионы увеличивают производительность, заключается в том, что позже потребуется больше трехмерных узлов.
Следующее изображение показывает пикселяцию исходного изображения. Обратите внимание, что каждая пикселированная область представляет собой твердый цвет, что означает, что Blockcam не должна читать всю область, чтобы получить цвет - только один пиксель.

Пикселированное изображение затем анализируется. Это влечет за собой получение цвета каждой пикселированной области. Это медленнее, чем ожидалось. Получение отдельных данных пикселей с изображения требует большого количества манипуляций с данными изображения, чтобы подготовить изображение для запроса. В конце этого шага изображения больше не используются. 2D -массив цветовых данных передается на следующий шаг.
На этом этапе данные с пикселированным изображением сохраняются в локальном хранилище файлов. Это для упрощения незначительных визуальных изменений, которые позже запрошены пользователем.
Окончательная форма узла - это настройка пользователя. Blockcam позволяет пользователям выбирать из одной из многих форм-встроенные фигуры имеют тенденцию работать быстрее, чем не встроенные фигуры (например, сферы быстрее, чем пентагоны). 3D -узл генерируется для каждого цвета с шага анализа изображения с использованием указанной геометрии. Чтобы показать 3D-страну финальной сцены, в некотором измерении узлы преувеличены. Например, если кубики являются формой, выбранной пользователем, длина будет преувеличена. Преувеличение определяется цветом - цвет используется для затенения диффузной поверхности узла, а также для определения высоты. Преувеличение определяется с выбранным пользователем детерминантом:
Как только узел был создан, он добавляется в мастер -узел. Как только все узлы были созданы и помещены в мастер -узел, сам мастер -узел помещается на трехмерную сцену.
Хотя это может показаться тривиальным шагом, при преобразовании видео очень сложно. Если преобразование изображения, все, что происходит, - это 3D -сцена обновляется и в конечном итоге показана пользователю (обычно в течение от 0,5 до 2,0 секунд). Для видео очень важно получить время на дисплее: чтобы преобразовать видео, каждый кадр проходит через эти шаги, а затем сделан снимок 3D -сцены. Если снимок будет сделан до отображения сцены, результатом будет чисто черное изображение, которое не хочет видеть пользователь. Следовательно, Blockcam должна участвовать в наборе функций SCNSceneRendererDelegate , чтобы знать, когда сцена на самом деле видна пользователю.
Следующее изображение является окончательной обработанной версией изображения. Это вывод вызова snapshot() на ScnView. Образец использует экструдированные блоки и просматривается в ориентации камеры по умолчанию.

Как только изображение отображается, у пользователя есть возможность сохранить его, как есть, или отредактировать некоторые визуальные аспекты или вращать или увеличивать или уменьшить, а затем сохранить его (возможно, возможно,). Для видео, как только снимок 3D -сцены запечатлен, сцена утилизирована.
В зависимости от значения .SaveOriginalImageAction , исходное изображение будет сохранено. Когда пользователь сохраняет обработанное изображение, метаданные сохраняются вместе с обработанным изображением. Метаданные состоит из названия и версии программы, а также параметров, действующих при создании изображения.
Сохранение обработанных файлов является многоэтапным процессом:
/Scratch как стандартный файл .jpg ..jpg ).PHAssetCreationRequest с соответствующим набором параметров - это необходимо, потому что более распространенный метод для перемещения изображений в данные Exif Photo Rolps)./Scratch .Blockcam сохраняет метаданные в обработанных файлах.
| Группа | Ярлык | Сохраненные значения |
|---|---|---|
| Тифф | Художник | Если он включен пользователем, имя пользователя. |
| Тифф | Авторское право | Если пользователь включена, строка авторских прав пользователя. |
| Тифф | Программное обеспечение | Имя, версия и номера Blockcam. |
| Выпуск | Пользовательский состав | Список параметров, используемых для генерации обработанного изображения. |
Смотрите также обсуждение конфиденциальности.
Упрощенная схема потока для обработки изображений показана ниже.

Из -за количества времени, необходимого для предварительного обработки и пикселла, каждый раз, когда обрабатывается новое изображение, данные о пикселяции (состоящие из массива цветов) сохраняются в файловой системе устройства. Если пользователь затем изменяет параметр (например, 3D -форма), предварительная обработка уже завершена, а данные о пикселяции повторно используются. Это потенциально может сэкономить много времени.
Если пользователь меняет параметр, который влияет на предварительную обработку, изображение перерабатывается с самого начала. (Например, изменение размера блока приведет к выполнению полного цикла переработки.)
Упрощенная схема потока для обработки видео показана ниже. Куб ссылается на поток изображения.

В настоящее время зеленая коробка («обработанная кадр») не функционирует, как ожидалось/требуется, поэтому при текущем письме создание видео не поддерживается.
Blockcam регистрирует сообщения и статус во время выполнения в консоли отладки (если присутствует, и в подавляющем большинстве случаев этого не будет присутствовать) и в локальную базу данных SQLite. Это допускает посмертную отладку, если возникнет необходимость.
Учитывая политику Apple по аренде данных (не говоря уже о политике ЕС), вполне вероятно, что ведение журнала будет удалено (через флаги с компиляцией) для любой выпущенной версии Blockcam.
Все настройки пользователя (и несколько настроек процесса) хранятся через класс Settings . Этот класс инкапсулирует механизм хранения, который невидим для остальной части программы. В настоящее время механизм хранения является UserDefaults . Если настройки станут более сложными, легко перенести это в базу данных.
Чтобы получить доступ к настройкам, вызывающие абоненты должны использовать предоставленные методы класса Settings . Это помогает обеспечить целостность типа данных.
Класс Settings также предоставляет уведомления об изменениях на уровне настроек (что было основной причиной для создания класса в первую очередь).
Настройки блокировки представлены ниже.
| Символ | Тип | По умолчанию | Использование |
|---|---|---|---|
| .Initialized | Нить | "Инициализирован" | Флаг, который определяет, были ли настройки инициализированы или нет. Когда Blockcam впервые запускается, если .Initialized - это NIL или пустая, предполагается, что это первая Blockcam, и поэтому, поэтому записывает значения по умолчанию для всех настроек. |
| .Blocksize | Целое число | 48 | Размер блока для обработки изображений. Это квадратный размер каждой пикселированной области. |
| .Shapetype | Нить | "Блоки" | То же самое 3D -объект в каждой области пикселя. Бросить из перечисления. |
| .Inverte | Логический | ЛОЖЬ | Флаг определения высоты/размера инверта. |
| .HeightSource | Нить | "Яркость" | Цветовой канал для определения высоты/размера. Бросить из перечисления. |
| .ImagesizeConstraints | Нить | "Середина" | Определяет количество сокращения размера изображения, которое нужно сделать, прежде чем обрабатывать его по соображениям производительности. Бросить из перечисления. Фактическое значение интерпретируется во время выполнения. |
| . ВОДЕРЖАНИЕ | Нить | "Середина" | Количество вертикального преувеличения для выполнения при вытягивании или увеличении трехмерных форм. Бросить из перечисления. |
| .InputQuality | Целое число | 2 | Значение, которое указывает на качество ввода. Диапазон от 0 до 3, а 3 - самое высокое качество (и самое медленное в обработке). |
| .Currentcamera | Нить | "Назад" | Положение последней камеры. Либо спереди, либо сзади. Бросить из перечисления. |
| .Lightcolor | Нить | "Белый" | Название цвета света. Бросить из перечисления. Может быть преобразован в цветной библиотечной библиотеки позже. |
| .LightType | Нить | "Омни" | Название типа света, используемого для освещения сцены. Бросить из перечисления. |
| .Lightintensity | Нить | "Нормальный" | Интенсивность света, используемой для освещения сцены. Фактическое значение, определенное во время выполнения. Бросить из перечисления. |
| .Fieldofview | Нить | "Нормальный" | Поле вида камеры. Фактическое значение определяется во время выполнения. Бросить из перечисления. |
| .Showhistogram | Логический | ЛОЖЬ | Показать дисплей гистограммы. В настоящее время не реализовано. |
| .HistogrambucketCount | Целое число | 256 | Количество цветов на дисплее гистограммы. В настоящее время не реализовано. |
| .InitialView | Нить | "LiveView" | Последнее представление, которое можно увидеть пользователем (например, Live View, альбомы и т. Д.). |
| . | Логический | истинный | Определяет, полностью ли буквы полностью экструдированы или частично экструдированы. |
| .LettersMoothness | Нить | "Гладкий" | Определяет, насколько гладко создавать кривые в буквах. Кривые высокого качества стоят за большую стоимость производительности. Фактическое значение, определенное во время выполнения. Бросить из перечисления. |
| .Letterfont | Нить | "Futura" | Шрифт (и необязательный вес) для использования для отображения экструдированных букв. Если шрифт не существует в системе, Blockcam войдет в неопределенное состояние. |
| .RandomCharactersource | Нить | "Латинский" | Названный диапазон символов Unicode для использования в качестве источника для случайных букв при вытягивании символов. Многочисленные диапазоны могут быть указаны путем отделения каждого от других с запятой. |
| .Videofps | Целое число | 1 | В настоящее время не используется. |
| . Видеодименсии | Нить | "Самый маленький" | Определяет окончательный размер видео при создании видео. Фактическое значение, определенное во время выполнения. Бросить из перечисления. |
| .Videoblocksize | Целое число | 48 | Размер блока для обработки видео. Это квадратный размер каждой пикселированной области. |
| .Usemetal | Логический | истинный | Флаг, который говорит Blockcam использовать металл, а не OpenGL. |
| .AntialiasingMode | Целое число | 0 | Определяет режим антиалиазии. |
| .InitialBestFit | Логический | ЛОЖЬ | Если это правда, Blockcam попытается вписать все узлы в вид с максимально плотно. |
| .Saveoriginalimageaction | Нить | "Всегда" | Определяет, как и когда сохранять оригинальные изображения. Бросить из перечисления. |
| .Next Secredentianteger | Целое число | 0 | Используется для генерации имен файла. |
| .Loop SecredteIntegerafter | Целое число | 9999 | Определяет, когда можно перемещаться до начала при использовании последовательных целых чисел. |
| .StartEncientIntegerat | Целое число | 1 | Начальное значение для последовательных целых чисел. |
| . INCREASESTARAPEXESWITHPOMINENCE | Логический | ЛОЖЬ | Если это правда, количество вершин для звездных форм увеличивается с известностью высоты цвета. |
| .Starapexcount | Целое число | 5 | Количество вершин для звезд. Если .IncreaseStarApexesWithProminence INCREASESTARAPEXESWITHPOMINENCE верно, это начальное число вершин. |
| .Haltwhencriticalthermal | Логический | истинный | Если True, Blockcam остановится (через вызов fatalError ), когда она получит критическое тепловое предупреждение. Это может нарушать руководящие принципы Apple и может быть удалено. |
| .Haltonlowpower | Логический | истинный | Если True, Blockcam остановится (через вызов fatalError ), когда она получит предупреждение о низкой мощности. Это может нарушать руководящие принципы Apple и может быть удалено. |
| .BESTFITOFFSET | Двойной | 2.0 | Значение, которое можно использовать, чтобы отсоединить камеру, когда .InitialBestFit верно, чтобы дать немного больше негативного пространства для изображения. |
| .LightingModel | Нить | "Фонг" | Модель освещения поверхности. Бросить из перечисления. |
| .Cappedlineballlocation | Нить | "Вершина" | Расположение мяча («кепка») для узлов в форме ограниченной линии. Бросить из перечисления. |
| .LoggingEnabled | Логический | ЛОЖЬ | Включить флаг регистрации. |
| .Fontsize | Целое число | 36 | Размер шрифта для экструдированных букв. |
| .EnableUisounds | Логический | истинный | Флаг для воспроизведения звуков пользовательского интерфейса (например, когда нажата кнопка). Если это значение false , все остальные звуковые флаги игнорируются. |
| .EnableShuttersound | Логический | ЛОЖЬ | Флаг, чтобы воспроизвести звук затвора, когда нажата кнопка камеры. В некоторых географических местах это всегда происходит, и установка этого значения не будет иметь никакого эффекта. |
| .EnableImageProcessingSound | Логический | истинный | Флаг, чтобы воспроизвести звук в начале и в конце обработки изображений. Поскольку обработка изображений занимает много времени, это помогает пользователю понять, когда изображение завершено. |
| .EnablevideoreCordingsound | Логический | истинный | Флаг, чтобы воспроизвести звук, когда пользователь начинает и перестает записывать видео. |
| .EnablebuttonPressSounds | Логический | истинный | Флаг, чтобы воспроизвести звук, когда пользователь нажимает кнопки. |
| .EnableOptionSelectsounds | Логический | истинный | Флаг, чтобы воспроизвести звук, когда пользователь выбирает опцию на дисплее настройки на экране. |
| .Enablecrashsounds | Логический | ЛОЖЬ | Флаг, чтобы воспроизвести звук, когда отображается диалог сбоя. Включено только при составлении в режиме #debug . |
| .Meshdotsize | Нить | "Середина" | Размер центральной точки для сетки. Если .None Не используется, центральная точка не будет отображаться. Бросить из перечисления. |
| .MeshlineThickness | Нить | "Середина" | Толщина сетчатых линий. Бросить из перечисления. |
| .RadiatingLineThickness | Нить | "Середина" | Толщина излучающих линейных форм. Бросить из перечисления. |
| .Radiathinglinecount | Целое число | 8 | Количество излучающих линий в излучающей форме линии. 4 -для линий, указывающих на кардинальные направления, 8 для кардинальных направлений и между ними, и 16 для еще 8 линий в Z-плоскости. |
| .Blockchamfersize | Нить | "Никто" | Радиус пасы/гладкость края для форм блоков. Бросить из перечисления. |
| .MaximagedImension | Целое число | 1024 | Максимальное измерение изображения. Если изображение для обработки больше, оно будет изменено так, что самое длинное измерение - это значение. |
| .AdduserDatatoExif | Логический | ЛОЖЬ | Флаг, чтобы добавить пользовательскую информацию в Exif Block обработанных изображений. Если это составлено в режиме #debug, это значение по умолчанию по умолчанию к True. |
| .Имя пользователя | Нить | "" | (По умолчанию пусто.) Имя, поставляемое пользователем, которое добавлено в блок обработанных изображений. Это происходит только в том случае, если .AddUserDataToExif является правдой. Если это составлено в режиме #DeBug, это значение по умолчанию по умолчанию «Стюарт Ранкин». |
| .Usercopyright | Нить | "" | (По умолчанию пустая.) Строка авторского права, поставляемое пользователем, которая добавляется в блок Exif обработанных изображений. Это происходит только в том случае, если .AddUserDataToExif является правдой. При составлении в режиме #debug это значение по умолчанию по умолчанию «атрибуция 3.0 без порта (CC By 3.0)». |
| .Coneisinverted | Логический | истинный | Определяет, инвертированы ли формы конусов с точки зрения глубины z. |
| .Conetopoptions | Нить | .TopIsZero .rawvalue | Варианты определения верхнего радиуса конуса. |
| .Conebaseoptions | Нить | .BaseIsSide .rawvalue | Варианты определения базового радиуса конуса. |
| .Showsplashscreen | Логический | истинный | Флаг, который определяет, отображается ли экран брызг при запуске или нет. |
| .Hueshapelist | Нить | "" | Список форм для типа формы Hue. |
| .SaturationShapelist | Нить | "" | Список форм для типа формы насыщения. |
| .Brightnessshapelist | Нить | "" | Список форм для типа формы яркости. |
Blockcam использует 3D -обработку, которая управляет графическим чипом устройства. Если пользователь определяет настройки высочайшего качества, возможно, могут возникнуть определенные экстремальные условия. Чтобы помочь сохранить устройство от повреждений, настройки доступны для прерывания выполнения блокмедины, когда это произойдет.
| Событие | Действие | Контроль настройки |
|---|---|---|
| Тепло | Если тепловое событие достигает критической стадии (буквально .critical в уведомлении), если настройка является true , будет создана фатальная ошибка, чтобы уменьшить любое тепловое напряжение, созданное блокой. | .HaltWhenTooHot |
| Батарея | Если аккумулятор входит в состояние низкой мощности, если настройка true , будет создана фатальная ошибка, чтобы помочь сохранить срок службы батареи перед перезарядкой. | .HaltOnLowPower |
Blockcam поддерживает следующие визуальные эффекты:
В настоящее время поддерживаются следующие формы (или планируются поддерживать) для эффектов экструзии:
| Форма | Родной | Примечания |
|---|---|---|
| Блоки | Да - SCNBox | Нативные формы коробки удлинены вдоль оси Z. |
| Треугольники | Нет | Пользовательские равносторонние формы треугольника. |
| Пентагоны | Нет | Пользовательские равенственные формы Пентагона. |
| Гексагоны | Нет | Пользовательские равносторонние шестиугольные формы. |
| Октагоны | Нет | Пользовательские равносторонние восьмиугольные формы. |
| Пирамиды | Да - SCNPyramid | Нативные формы пирамиды. |
| Тороиды | Да - SCNTorus | Родные формы тора. |
| Цилиндры | Да - SCNCylinder | Нативные формы цилиндров - приносят приятные повышенные круги. |
| Сферы | Да - SCNSphere | Нативные формы сферы. |
| Капсулы | Да - SCNCapsule | Нативные формы капсулы. Не так интересно, как они звучат. |
| Тетраэдры | Нет | Пользовательский равенственный тетраэдр твердый. |
| Звезда | Нет | Пользовательские формы звезд (с радиально равными вершинами). Может изменить количество вершин. |
| Комбинированноефорргб | Да - комбинация | Комбинированная сфера, тора и капсула. |
| Комбинированноефорхсб | Да - комбинация | Комбинированная сфера, тора и капсула. |
| Сетки | Нет | В настоящее время не реализовано. |
| Буквы | Да - SCNText | Нативный экструдированный текст. Имеет тенденцию быть чрезвычайно медленным, особенно с нелатинскими алфавитами. |
| Линии | Да - SCNCapsule | Очень тонкая форма капсулы. |
| Кэппедлины | Да - комбинация | Очень тонкая форма капсулы с сферой, расположенной в верхней, средней или нижней части линии в зависимости от настройки пользователя. |
| Radiatinglines | Да - комбинация | Несколько линий, излучающихся из центральной точки. Пользователь может указать, сколько строк. Это производительная форма. |
| Huevarying | варианты | Форма в данной точке определяется оттенком пикселированной области, поэтому фактическая конечная форма будет варьироваться. |
| Насыщение | варианты | Форма в данной точке определяется насыщением пикселированной области, поэтому фактическая конечная форма будет варьироваться. |
| Яркость | варианты | Форма в данной точке определяется яркостью пикселированной области, поэтому фактическая конечная форма будет варьироваться. |
Каждая форма для репрезентативной пикселированной области экструдирована или увеличена. Определение глубины экструзии или увеличенного размера зависит от цвета пикселированной области.
| Цветной канал | Использование |
|---|---|
| Оттенок | Оттенок цвета определяет глубину/размер 3D -объекта. Обратите внимание, что значения оттенка являются циклическими (с 0,0, по существу, такими же, как 1,0), поэтому красноватые пиксели, как правило, подавляются, пока выделяются зеленые. |
| Насыщенность | Значение насыщения цвета определяет глубину/размер. Яркие цвета будут больше. |
| Яркость | Яркость цвета определяет глубину/размер. Это значение по умолчанию и то, как большинство людей ожидают, что программа будет работать. |
| Красный | Красный канал используется для определения глубины/размера. |
| Зеленый | Зеленый канал используется для определения глубины/размера. |
| Синий | Синий канал используется для определения глубины/размера. |
| Голубой | Синтетический голубой канал (из CMYK) используется для определения глубины/размера. |
| Пурпурный | Синтетический пурпурный канал (от CMYK) используется для определения глубины/размера. |
| Желтый | Синтетический желтый канал (от CMYK) используется для определения глубины/размера. |
| Черный | Синтетический черный канал (от CMYK) используется для определения глубины/размера. |
| Юв: y | Синтетический канал Y от конверсии YUV. |
| Юв: ты | Синтетический U -канал от конверсии YUV. |
| Юв: v | Синтетический V -канал от конверсии YUV. |
Blockcam поддерживает перевернутый флаг. Это означает, что если пользователь устанавливает инвертирование, глубина/размер является взаимной самой собой, что делает темные области заметными и легкими областями подавленными или скрытыми.
Blockcam поддерживает изменение цвета света, а также тип света. Цвета в настоящее время ограничены небольшим набором заранее определенных цветов. Типы света параллельны стандартные непараметрированные светильники Scenekit (такие как .omni и .spot ).
Положение света в настоящее время не регулируется пользователем.
Blockcam использует флаг SCNView allowsCameraControl Flag, чтобы позволить пользователю увеличивать, кожу или вращаться (в трех осях) посредством жестов.
При первоначальном виде, результат может показаться относительно далеко от взгляда. У Blockcam есть настроенный пользователь флаг, чтобы соответствовать изображению для представления. Эта функция, как правило, путает, allowsCameraControl в отношении увеличения и сокращения.
В этом разделе будут обсуждаться различные данные на уровне реализации.
Blockcam была записана в Swift 5 с Xcode 11.3.
Учитывая длительное количество времени, которое требуется для обработки изображений, вся обработка изображений выполняется на фоновом потоке. Это требует, чтобы вся связь обновляла пользователя через пользовательский интерфейс, который должен быть сделан с помощью соответствующих вызовов с потоком.
TBD
Blockcam - Copyright © 2019, 2020, Стюарт Ранкин
日本語版 «Google 翻訳で翻訳»
3d ブロックカメラ
Blockcam は ios および iPados 用のカメラプログラムで、 avfoundation を介して画像を取得し、それらの画像を単純な 3d シーンに変換します。シーンは、ユーザーによって回転および拡大縮小され、フラットイメージとして保存されます。
Блоккма は Стюарт Ранкин によって作成されました。
Blockcam のバージョン管理は версии. Versioning.swiftルで管理され、ビルド前のスクリプトステップとしてビルドごとに自動的に更新されます。 更新にはビルド ID 、ビルド番号、時刻、日付が含まれますが、現在、バージョン番号は手動で更新する必要があります。 以下の現在のビルド文字列も同じメカニズムによって維持されます。
現在、バージョン管理プログラムは Блоккма プロジェクトファイルのバージョン番号を更新しません。
最新のビルド : バージョン情報については、英語のセクションを参照してください。
バージョンとビルドの更新方法については、 Github の [versionupdater] (https://github.com/sjrankin/versionupdater) リポジトリを参照してください。 リポジトリを参照してください。 リポジトリを参照してください。
Блоккма は、可能な限りユーザーが提供する情報を含むように設計されています。 ユーザーを特定できる情報が使用されるたびに、 Blockcam はそれを明示的に要求します。 設計上、 Blockcam はデフォルトでユーザーを特定できる情報を収集しません。 ユーザーは、このタイプの情報の収集を許可するためにアクティブな手順を実行する必要があります。
| 識別情報 | 使用 | 保管 |
|---|---|---|
| ユーザー名 | 処理された画像のメタデータに保存されるユーザーの名前 (ユーザーが入力)。 | 「Userdefaults 」に保存されます。 |
| ユーザー著作権 | 処理された画像メタデータに保存されるユーザーの著作権文字列 (ユーザーが入力)。 | 「Userdefaults 」に保存されます。 |
ユーザーが Blockcam をインスタンス化すると、ライブビューモードで開きます (メイン画面にカメラのビューを表示) 3 つのモードのいずれかを選択するオプションがあります。
Блоккма は、次のプラットフォームでテストされています。
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は、処理されたファイルにメタデータを保存します。
| グループ | タグ | 保存された値 |
|---|---|---|
| Тифф | アーティスト | ユーザーが有効にした場合、ユーザーの名前。 |
| Тифф | 著作権 | ユーザーが有効にした場合、ユーザーの著作権文字列。 |
| Тифф | ソフトウェア | BlockCamの名前、バージョン、ビルド番号。 |
| Exif | UserComment | 処理済み画像の生成に使用されるパラメーターのリスト。 |
画像の前処理とピクセル化には時間がかかるため、新しい画像が処理されるたびに、ピクセル化データ(色の配列で構成される)がデバイスのファイルシステムに保存されます。 その後、ユーザーがパラメーター(3D形状など)を変更した場合、前処理は既に完了しており、ピクセル化データは再利用されます。 これにより、大幅に時間を節約できる可能性があります。
ユーザーが前処理に影響するパラメーターを変更すると、画像は最初から再処理されます。 (たとえば、ブロックサイズを変更すると、完全な再処理サイクルが実行されます。)
BlockCamは、実行時のメッセージとステータスをデバッグコンソール(存在する場合、大部分のインスタンスでは存在しない)とローカルSQLiteデータベースに記録します。 これにより 必要が生じた場合の事後デバッグ。
Appleのデータ保持に関するポリシー(EUのポリシーは言うまでもありません)を考えると、BlockCamのすべてのリリースバージョンのログは(コンパイル時フラグを介して)削除される可能性が高いです。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。 このクラスは、プログラムの残りの部分からは見えないストレージメカニズムをカプセル化します。 現在、ストレージメカニズムはUserDefaultsです。 設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、呼び出し側はSettingsクラスの提供されたメソッドを使用する必要があります。 これにより、データ型の整合性を確保できます。
Settingsクラスは設定レベルの変更通知も提供します(これが最初にクラスを作成する主な理由でした)。
BlockCamの設定を以下に示します。
| 記号 | タイプ | デフォルト | 使用法 |
|---|---|---|---|
| .Initialized | Нить | "Initialized" | 設定が初期化されたかどうかを決定するフラグ。 BlockCamが最初に実行されるときに、 .Initializedがnilまたは空の場合、BlockCamが最初に実行されたと想定されるため、すべての設定のデフォルト値を書き込みます。 |
| .BlockSize | 整数 | 48 | 画像処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .ShapeType | Нить | "Blocks" | 各ピクセル化領域の3Dオブジェクトと同じ。列挙型からキャストします。 |
| .InvertHeight | Boolean | ЛОЖЬ | 反転高さ/サイズ決定フラグ。 |
| .HeightSource | Нить | "Brightness" | 高さ/サイズを決定するために使用するカラーチャンネル。列挙型からキャストします。 |
| .ImageSizeConstraints | Нить | "Середина" | パフォーマンス上の理由から、処理する前に行う画像のサイズの縮小量を決定します。列挙型からキャストします。実行時に解釈される実際の値。 |
| .VerticalExaggeration | Нить | "Середина" | 3D形状を押し出しまたは拡大するときに実行する垂直方向の誇張の量。列挙型からキャストします。 |
| .InputQuality | Integer | 2 | 入力品質を示す値。 0から3の範囲で、3が最高品質(および処理が最も遅い)です。 |
| .CurrentCamera | Нить | "Назад" | 最後に使用したカメラの位置。前面または背面。列挙型からキャストします。 |
| .LightColor | Нить | "Белый" | ライトの色の名前。列挙型からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .LightType | Нить | "Omni" | シーンの照明に使用されるライトのタイプの名前。列挙型からキャストします。 |
| .LightIntensity | Нить | "Нормальный" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙型からキャストします。 |
| .FieldOfView | Нить | "Нормальный" | カメラの視野。実際の値は実行時に決定されます。列挙型からキャストします。 |
| .ShowHistogram | Boolean | ЛОЖЬ | ヒストグラム表示を表示します。現在実装されていません。 |
| .HistogramBucketCount | 整数 | 256 | ヒストグラム表示の色数。現在実装されていません。 |
| .InitialView | Нить | "LiveView" | ユーザーが最後に表示したビュー(ライブビュー、アルバムなど)。 |
| .FullyExtrudeLetters | Boolean | истинный | 文字が完全に押し出されるか、部分的にのみ押し出されるかを決定します。 |
| .LetterSmoothness | Нить | "Гладкий" | 文字の曲線をどれだけスムーズに作成するかを決定します。高品質の曲線には、大きなパフォーマンスコストがかかります。実行時に決定される実際の値。列挙型からキャストします。 |
| .LetterFont | Нить | "Futura" | 押し出された文字のレンダリングに使用するフォント(およびオプションの太さ)。フォントがシステムに存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | Нить | "Латинский" | 文字を押し出すときにランダムな文字のソースとして使用する名前付きUnicode範囲。複数の範囲を指定するには、それぞれをコンマで区切ります。 |
| .VideoFPS | 整数 | 1 | 現在使用されていません。 |
| .VideoDimensions | Нить | "Smallest" | ビデオを生成するときの最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙型からキャストします。 |
| .VideoBlockSize | 整数 | 48 | ビデオ処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .UseMetal | Boolean | истинный | OpenGLではなくMetalを使用するようにBlockCamに指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチエイリアスモードを決定します。 |
| .InitialBestFit | Boolean | ЛОЖЬ | trueの場合、BlockCamは、すべてのノードをビューにできるだけ厳密に合わせようとします。 |
| .SaveOriginalImageAction | Нить | "Всегда" | 元の画像を保存する方法とタイミングを決定します。列挙型からキャストします。 |
| .NextSequentialInteger | Integer | 0 | ファイル名の生成に使用。 |
| .LoopSequentialIntegerAfter | Integer | 9999 | 連続する整数を使用する場合、いつループを開始するかを決定します。 |
| .StartSequentialIntegerAt | Integer | 1 | 連続整数の開始値。 |
| .IncreaseStarApexesWithProminence | Boolean | ЛОЖЬ | trueの場合、星形の頂点の数は色の高さが顕著になるにつれて増加します。 |
| .StarApexCount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceがtrueの場合、これは頂点の開始数です。 |
| .HaltWhenCriticalThermal | Boolean | истинный | trueの場合、BlockCamは重大な温度アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .HaltOnLowPower | Boolean | истинный | trueの場合、BlockCamは低電力アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .BestFitOffset | Двойной | 2.0 | .InitialBestFitがtrueの場合にカメラを後退させて、画像にもう少しネガティブなスペースを与えるために使用する値。 |
| .LightingModel | Нить | "Phong" | 表面マテリアル照明モデル。列挙型からキャストします。 |
| .CappedLineBallLocation | Нить | "Вершина" | CappedLine形状のノードのボール(「キャップ」)の位置。列挙型からキャストします。 |
| .LoggingEnabled | Boolean | ЛОЖЬ | ロギングフラグを有効にします。 |
| .FontSize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .EnableUISounds | Boolean | истинный | Flagは、UIサウンドを再生します(ボタンが押されたときなど)。 この値が「false」の場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | Boolean | ЛОЖЬ | Flagは、カメラボタンが押されたときにシャッター音を再生します。 一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .EnableImageProcessingSound | Boolean | истинный | Flagは、画像処理の開始時と終了時に音声を再生します。 画像処理には時間がかかるため、ユーザーは画像がいつ完成するかを理解するのに役立ちます。 |
| .EnableVideoRecordingSound | Boolean | истинный | ユーザーがビデオの記録を開始および停止したときに音を再生するフラグ。 |
| .EnableButtonPressSounds | Boolean | истинный | ユーザーがボタンを押したときに音を再生するフラグ。 |
| .EnableOptionSelectSounds | Boolean | истинный | ユーザーが画面上の設定画面でオプションを選択したときに音を再生するフラグ。 |
| .EnableCrashSounds | Boolean | ЛОЖЬ | フラグは、クラッシュダイアログが表示されたときにサウンドを再生します。 #DEBUGモードでコンパイルされた場合のみ有効です。 |
| .MeshDotSize | Нить | "Середина" | メッシュの中心ドットのサイズ。 .Noneが使用される場合、中央のドットは表示されません。 列挙型からキャストします。 |
| .MeshLineThickness | Нить | "Середина" | メッシュラインの太さ。 列挙型からキャストします。 |
| .RadiatingLineThickness | Нить | "Середина" | 放射線形状の太さ。 列挙型からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射ライン形状の放射ラインの数。 「4」は基線方向を指す線、「8」は基線方向とその中間、および「16」はz平面のさらに8本の線を示します。 |
| .BlockChamferSize | Нить | "Никто" | ブロック形状の面取り半径/エッジの滑らかさ。 列挙型からキャストします。 |
| .MaxImageDimension | 整数 | 1024 | 画像の最大寸法。 処理する画像が大きい場合、最長寸法がこの値になるようにサイズ変更されます。 |
| .AddUserDataToExif | Boolean | ЛОЖЬ | Flagは、ユーザーが作成した情報を処理済み画像のExifブロックに追加します。 |
| .Имя пользователя | Нить | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の名前。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します。 |
| .UserCopyright | Нить | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の著作権文字列。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します |
BlockCamは次のビジュアルをサポートしています。
現在、押し出し効果では次の形状がサポートされています(またはサポートされる予定です)。
| 形状 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい- SCNBox | Z軸に沿って長くなったネイティブボックスの形状。 |
| 三角形 | いいえ | カスタム正三角形の形状。 |
| 五角形 | いいえ | カスタム正五角形。 |
| 六角形 | いいえ | カスタム正六角形。 |
| オクトゴン | いいえ | カスタム正八角形。 |
| ピラミッド | はい- SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい- SCNTorus | ネイティブトーラス形状。 |
| シリンダー | はい- SCNCylinder | 自然なシリンダー形状-すてきな高架円になります。 |
| 球 | はい- SCNSphere | ネイティブの球形。 |
| カプセル | はい- SCNCapsule | ネイティブカプセルの形状。聞こえるほど面白くない。 |
| 四面体 | いいえ | カスタム正四面体ソリッド。 |
| 星 | いいえ | カスタム星形(半径方向に等しい頂点を持つ)。頂点の数を変えることができます。 |
| CombinedForRGB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| CombinedForHSB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| レター | はい- SCNText | ネイティブの押し出しテキスト。特に非ラテン系のアルファベットでは、非常に遅くなる傾向があります。 |
| 行 | はい- SCNCapsule | 非常に薄いカプセル形状。 |
| CappedLines | はい-組み合わせ | ユーザー設定に応じて、行の上部、中間、または下部に球体を配置した非常に薄いカプセル形状。 |
| RadiatingLines | はい-組み合わせ | 中心点から放射状に広がる複数の線。 ユーザーは行数を指定できます。 これはパフォーマンス重視の形状です。 |
代表的なピクセル化領域の各形状は、押し出しまたは拡大されます。押し出しの深さまたは拡大サイズの決定は、ピクセル化された領域の色に依存します。
| カラーチャンネル | 使用方法 |
|---|---|
| Hue | 色の色相は、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