3Dブロックカメラ
BlockCamは、iOSおよびiPados向けのカメラプログラムで、AVFoundationで画像を撮影し、それらの画像を単純な3Dシーンに変換します。シーンは、ユーザーによって回転およびスケーリングされ、フラット画像として保存される場合があります。
BlockcamはStuart Rankinによって書かれました。
BlockCamのバージョン化は、 Versioning.swiftファイルで維持され、各ビルドでプリビルドスクリプトステップとして自動的に更新されます。更新には、ビルドID、ビルド番号、時間、日付が含まれますが、バージョン番号は現在手作業で更新する必要があります。以下の現在のビルド文字列は、同じメカニズムによっても維持されます。
バージョンプログラムは現在、BlockCam Projectファイルのバージョン番号を更新していません。
最新のビルド:バージョン0.9アルファ、ビルド3287、ビルド日:2021年7月13日、16:06
バージョンとビルドの更新方法については、githubのversionupdaterリポジトリを参照してください。
BlockCamは、ユーザーが提供する情報を可能な限り含むように設計されています。ユーザー識別可能な情報がいつでも使用されるたびに、BlockCamはそれを明示的に要求します。設計上、BlockCamはデフォルトでユーザーの識別可能な情報を収集しません。ユーザーは、このタイプの情報の収集を許可するために積極的な措置を講じる必要があります。
| 識別可能な情報 | 使用 | ストレージ |
|---|---|---|
| ユーザー名 | ユーザーの名前(ユーザーが入力)は、処理された画像メタデータに保存されます。 | UserDefaultsに保存されています。 |
| ユーザーの著作権 | 処理された画像メタデータに保存されるユーザーの著作権文字列(ユーザーが入力)。 | UserDefaultsに保存されています。 |
ユーザーがBlockCamをインスタンス化すると、ライブビューモードで開きます(メイン画面でカメラのビューを表示します)。ユーザーには、3つのモードのいずれかを選択するオプションがあります。
BlockCamは、次のプラットフォームでテストされています。
UIBezierPathを使用して、より多くの形状を追加します。BlockCamには4つのパフォーマンスの懸念があります。
autoreleasepoolブロックにメモリ集約型コードをループに配置することにより、ほとんどの懸念が対処されています。これが不十分であることが判明した場合、緩和計画は存在します。すべてのスクラッチ画像をローカルストレージに保存してから、それらを単独で読み、一度に1つずつ処理します。これにより、物事が遅くなりますが、メモリプレッシャーが低下します。BlockCamは、CoreImage Filter CIPixellateを介してピクセル化された画像に採取される各画像を変換します。ピクセル化後、処理アルゴリズムは高さを計算します - 高さはノードのサイズまたはノードの押し出しのいずれかを決定します。次に、ピクセル化された画像からの各ピクセルが3D形状(ユーザーによって設定)に変換され、3Dビューの現在のシーンに追加されます。
すべての処理操作は同じコードを使用しますが、有効なユーザー向けモードに応じて、異なる(または複数回)呼ばれる場合があります。
処理のために画像が取得されます。画像のソースは、標準のiOS/iPados読み取り可能な画像である限り重要ではありません。画像の最も一般的なソースは、おそらくライブビューカメラです。他のソースは、フォトアルバムとビデオフレームです。
次の画像は、処理のソースです。 (これは私が初冬に私たちの庭で撮った画像です。)

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

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

画像が表示されると、ユーザーはそのまま保存するか、視覚的な側面を編集したり、回転またはズームアウトしたり、ズームアウトしたりしてから保存するオプションを持っています(おそらく、おそらく)。ビデオの場合、3Dシーンのスナップショットがキャプチャされると、シーンは処分されます。
.SaveOriginalImageActionの値に応じて、元の画像が保存されます。ユーザーが処理された画像を保存すると、メタデータは処理された画像とともに保存されます。メタデータは、プログラムの名前とバージョンと、画像が作成されたときに有効なパラメーターで構成されています。
処理されたファイルを保存することは、マルチステッププロセスです。
/Scratchディレクトリに標準の.jpgファイルとして保存されます。.jpgファイルとして)。PHAssetCreationRequestを使用してください。これは、画像をPhoto Roll Strips Exifデータに移動するためのより一般的な方法で必要です)。/Scratchディレクトリから削除されます。BlockCamは、加工されたファイルにメタデータを保存します。
| グループ | タグ | 保存された値 |
|---|---|---|
| tiff | アーティスト | ユーザーによって有効になっている場合、ユーザーの名前。 |
| tiff | 著作権 | ユーザーによって有効になっている場合、ユーザーの著作権文字列。 |
| tiff | ソフトウェア | Blockcamの名前、バージョン、およびビルド番号。 |
| exif | ユーザーメント | 処理された画像を生成するために使用されるパラメーターのリスト。 |
プライバシーディスカッションも参照してください。
画像処理の単純化されたフロー図を以下に示します。

画像を前処理してピクセル化するのに時間がかかるため、新しい画像が処理されるたびに、ピクセルデータ(色の配列で構成される)がデバイスのファイルシステムに保存されます。ユーザーがパラメーター(3Dシェイプなど)を変更すると、前処理が既に完了しており、ピクセルデータが再利用されます。これにより、大幅な時間を節約できます。
ユーザーがプレ前処理に影響するパラメーターを変更すると、画像は最初から再処理されます。 (たとえば、ブロックサイズを変更すると、完全な再処理サイクルが実行されます。)
ビデオ処理のための単純化されたフロー図を以下に示します。キューブは画像の流れを参照します。

現在、緑色のボックス(「プロセスフレーム」)は、予想どおり/必要に応じて機能しないため、現在の書き込みのように、ビデオの作成はサポートされていません。
BlockCamは、実行時にメッセージとステータスをデバッグコンソール(存在する場合、および大部分のインスタンスの場合、これは存在しません)およびローカルSQLiteデータベースにログを記録します。これにより、必要性が発生した場合に死後のデバッグが可能になります。
データ賃貸に関するAppleのポリシー(EUのポリシーは言うまでもありません)を考えると、BlockCamのリリースバージョンのログは(コンパイル時間フラグを介して)削除される可能性があります。
すべてのユーザー設定(およびいくつかのプロセス設定)は、 Settingsクラスを介して保存されます。このクラスは、プログラムの残りの部分には見えないストレージメカニズムをカプセル化します。現在、ストレージメカニズムはUserDefaultsです。設定がより複雑になった場合、これをデータベースに移行するのは簡単です。
設定にアクセスするには、発信者はSettingsクラスの提供された方法を使用する必要があります。これにより、データ型の整合性を確保するのに役立ちます。
Settingsクラスは、変更の設定レベルの通知も提供します(これは、そもそもクラスを作成する主な理由でした)。
BlockCamの設定を以下に示します。
| シンボル | タイプ | デフォルト | 使用法 |
|---|---|---|---|
| .Initialized | 弦 | 「初期化」 | 設定が初期化されているかどうかを決定するフラグ。 BlockCamが最初に実行されると、 .Initializedがnilまたは空である場合、Blockcamが実行されたのは初めてであるため、すべての設定のデフォルト値を書き込みます。 |
| .blocksize | 整数 | 48 | 画像処理のブロックサイズ。これは、各ピクセル領域の平方サイズです。 |
| .shapeType | 弦 | 「ブロック」 | 各ピクセル領域の3Dオブジェクトと同じ。列挙からキャストします。 |
| .invertheight | ブール | 間違い | 反転高さ/サイズの決定フラグ。 |
| .heightsource | 弦 | "輝度" | 高さ/サイズを決定するために使用するカラーチャネル。列挙からキャストします。 |
| .imagesizeConstraints | 弦 | "中くらい" | パフォーマンス上の理由で処理する前に、画像のサイズの縮小量を決定します。列挙からキャストします。実行時に解釈される実際の値。 |
| .verticalexaggeration | 弦 | "中くらい" | 3D形状の押し出しまたは拡大時に実行する垂直誇張の量。列挙からキャストします。 |
| .inputquality | 整数 | 2 | 入力品質を示す値。 0から3の範囲で、3は最高品質(およびプロセスが最も遅い)です。 |
| .CurrentCamera | 弦 | "戻る" | 使用した最後のカメラの位置。正面または背面のいずれか。列挙からキャストします。 |
| .lightcolor | 弦 | "白" | 光の色の名前。列挙からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .lighttype | 弦 | 「オムニ」 | シーンを照らすために使用される光のタイプの名前。列挙からキャストします。 |
| .lightentence | 弦 | "普通" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙からキャストします。 |
| .fieldofview | 弦 | "普通" | カメラの視野。実際の値は実行時に決定されます。列挙からキャストします。 |
| .showhistogram | ブール | 間違い | ヒストグラムディスプレイを表示します。現在実装されていません。 |
| .histogrambucketcount | 整数 | 256 | ヒストグラムディスプレイの色の数。現在実装されていません。 |
| .InitialView | 弦 | 「LiveView」 | ユーザーが見た最後のビュー(ライブビュー、アルバムなど)。 |
| .fulyextrudeletters | ブール | 真実 | 文字が完全に押し出されているか、部分的にのみ押し出されているかどうかを判断します。 |
| .LETTERSMOUTHNESS | 弦 | "スムーズ" | 文字に曲線を作成するためにどれだけスムーズに決定するかを決定します。高品質の曲線には、パフォーマンスコストが大幅にあります。実行時に決定される実際の値。列挙からキャストします。 |
| .LETTERFONT | 弦 | 「futura」 | 押し出し文字をレンダリングするために使用するフォント(およびオプションの重量)。システムにフォントが存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | 弦 | "ラテン" | 文字を押し出るときにランダムな文字のソースとして使用するUnicode範囲の文字と名付けられました。コンマでそれぞれを他の範囲から分離することにより、複数の範囲を指定できます。 |
| .videofps | 整数 | 1 | 現在使用されていません。 |
| .videodimensions | 弦 | "最小" | ビデオを生成するときに最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙からキャストします。 |
| .videoblocksize | 整数 | 48 | ビデオ処理のためのブロックサイズ。これは、各ピクセル領域の平方サイズです。 |
| .USEMETAL | ブール | 真実 | BlockcamにOpenGLではなく金属を使用するように指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチアリアーゼモードを決定します。 |
| .InitialBestFit | ブール | 間違い | Trueの場合、BlockCamはすべてのノードを可能な限りしっかりとビューに適合させようとします。 |
| .Saveoriginalimageaction | 弦 | "いつも" | 元の画像を保存する方法と時期を決定します。列挙からキャストします。 |
| .next sequentialinteger | 整数 | 0 | ファイル名の生成に使用されます。 |
| .loopsentionintegerafter | 整数 | 9999 | シーケンシャル整数を使用するときに開始までいつループするかを決定します。 |
| .StartSevensientInteGerat | 整数 | 1 | シーケンシャル整数の開始値。 |
| .increasestarapexeswithpromencent | ブール | 間違い | 真実の場合、星形の頂点の数は、色の高さの顕著なものとともに増加します。 |
| .starapexcount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceが真実である場合、これは頂点の開始数です。 |
| .haltwhencriticalthermal | ブール | 真実 | 真実の場合、Blockcamは、臨界熱警告を受けたときに( fatalError呼び出しを介して)停止します。これは、Appleのガイドラインに違反し、削除される可能性があります。 |
| .haltonlowpower | ブール | 真実 | 真実の場合、Blockcamは低電力アラートを受け取ったときに( fatalError呼び出すことで)停止します。これは、Appleのガイドラインに違反し、削除される可能性があります。 |
| .bestfitoffset | ダブル | 2.0 | .InitialBestFitが真実である場合、カメラをバックアウトするために使用する価値があります。 |
| .lightingModel | 弦 | 「フォン」 | 表面材料照明モデル。列挙からキャストします。 |
| .capplineballlocation | 弦 | "トップ" | キャップライン型ノードのボール(「キャップ」)の位置。列挙からキャストします。 |
| .loggingEnabled | ブール | 間違い | ロギングフラグを有効にします。 |
| .fontsize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .enableUisounds | ブール | 真実 | UIサウンドを再生するフラグ(ボタンが押されたときなど)。この値がfalseの場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | ブール | 間違い | カメラボタンを押したときにシャッターサウンドを再生するフラグ。一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .enableImageProcessingSound | ブール | 真実 | 画像処理の開始時と終了時にサウンドを再生するフラグ。画像処理は時間がかかるため、これはユーザーが画像が完了したときに理解するのに役立ちます。 |
| .enablevideorecordingsound | ブール | 真実 | ユーザーが起動してビデオの録音を停止したときにサウンドを再生するフラグ。 |
| .enableButtonPressSounds | ブール | 真実 | ユーザーがボタンを押したときにサウンドを再生するフラグ。 |
| .EnableOptionSelectSounds | ブール | 真実 | ユーザーが画面上の設定ディスプレイでオプションを選択したときにサウンドを再生するフラグ。 |
| .EnableCrashsounds | ブール | 間違い | クラッシュダイアログが表示されたときにサウンドを再生するフラグ。 #debugモードでコンパイルされた場合にのみ有効になります。 |
| .meshdotsize | 弦 | "中くらい" | メッシュの中心ドットのサイズ。 .Noneが使用されていない場合、中心ドットは表示されません。列挙からキャストします。 |
| .Meshlinethickness | 弦 | "中くらい" | メッシュラインの厚さ。列挙からキャストします。 |
| .radiatinglinethickness | 弦 | "中くらい" | 放射線形状の厚さ。列挙からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射線形状の放射線の数。 4 、基本的な方向に向かって、枢機inalの方向とその間に8 、Zプレーンのさらに8行で16指すライン用です。 |
| .blockchamfersize | 弦 | "なし" | ブロック形状の面取りの半径/エッジの滑らかさ。列挙からキャストします。 |
| .maximagedimension | 整数 | 1024 | 画像の最大寸法。処理する画像が大きい場合、最長の次元がこの値になるようにサイズ変更されます。 |
| .adduserdatatoexif | ブール | 間違い | ユーザーが作成した情報を処理された画像のEXIFブロックに追加するフラグ。 #debugモードでコンパイルされている場合、この値はデフォルトです。 |
| .username | 弦 | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されたユーザーがサプリした名前。これは、 .AddUserDataToExifが真である場合にのみ発生します。 #debugモードでコンパイルされている場合、この値はデフォルトで「Stuart Rankin」になります。 |
| .usercopyright | 弦 | "" | (デフォルトは空白です。)処理された画像のexifブロックに追加されたユーザーがサプリした著作権文字列。これは、 .AddUserDataToExifが真である場合にのみ発生します。 #debugモードでコンパイルされている場合、この値はデフォルトで「アトリビューション3.0(CC by 3.0)」になります。 |
| .ConeisInverted | ブール | 真実 | コーンの形がz深さの観点から反転しているかどうかを判断します。 |
| .conetopoptions | 弦 | .TopIsZero .RawValue | コーンの上半径を決定するためのオプション。 |
| .CONEBASEOPTIONS | 弦 | .BaseIsSide .RawValue | コーンのベース半径を決定するためのオプション。 |
| .showsplashscreen | ブール | 真実 | スプラッシュ画面が起動時に表示されるかどうかを決定するフラグ。 |
| .hueshapelist | 弦 | "" | 色相バリアント形状タイプの形状のリスト。 |
| 飽和Hapelist | 弦 | "" | 飽和バリアント形状タイプの形状のリスト。 |
| .brightnessshapelist | 弦 | "" | 輝度バリアント形状タイプの形状のリスト。 |
BlockCamは3D処理を使用して、デバイスのグラフィックチップを行使します。ユーザーが最高品質の設定を指定している場合、特定の極端な条件が発生する可能性があります。ダメージからデバイスを維持するのに役立つために、それが起こったときにブロックカムの実行を中止するために設定を利用できます。
| イベント | アクション | 制御設定 |
|---|---|---|
| サーマル | サーマルイベントがクリティカルステージに達した場合(文字通り通知では.critical )、設定がtrueある場合、BlockCamによって作成された熱応力を減らすために致命的なエラーが生成されます。 | .HaltWhenTooHot |
| バッテリー | バッテリーが低電力状態に入る場合、設定がtrueある場合、充電前にバッテリーの寿命を維持するのに役立つ致命的なエラーが生成されます。 | .HaltOnLowPower |
BlockCamは次のビジュアルをサポートしています。
以下の形状は現在、押し出し効果のためにサポートされています(またはサポートされる予定です)。
| 形 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい - SCNBox | Z軸に沿って延長されたネイティブボックスの形。 |
| 三角形 | いいえ | カスタムの正三角形の形状。 |
| 五角形 | いいえ | カスタムの均一五角形の形。 |
| ヘキサゴン | いいえ | カスタムの正三節形状。 |
| オクトゴン | いいえ | カスタムの等側八角形形状。 |
| ピラミッド | はい - SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい - SCNTorus | ネイティブトーラスの形。 |
| シリンダー | はい - SCNCylinder | ネイティブシリンダーの形状 - 高さのあるサークルになります。 |
| 球体 | はい - SCNSphere | ネイティブの球体形状。 |
| カプセル | はい - SCNCapsule | ネイティブカプセルの形。彼らが聞こえるほど面白くない。 |
| テトラヘドロン | いいえ | カスタムの四項四面体固体。 |
| 星 | いいえ | カスタムスターシェイプ(放射状に等しい頂点を持つ)。頂点の数を変えることができます。 |
| combinedforrgb | はい - 組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| combinedforhsb | はい - 組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| 手紙 | はい - SCNText | ネイティブの押し出しテキスト。特にラチン以外のアルファベットでは、非常に遅くなる傾向があります。 |
| 線 | はい - SCNCapsule | 非常に薄いカプセルの形。 |
| キャップライン | はい - 組み合わせ | ユーザーの設定に応じて、ラインの上、中央、または下部に球体が配置された非常に薄いカプセルの形状。 |
| 放射線 | はい - 組み合わせ | 中心点から放射される複数の線。ユーザーは、行の数を指定できます。これはパフォーマンスが多い形状です。 |
| huevarying | バリアント | 特定の点での形状は、ピクセル領域の色相によって決定されるため、実際の最終形状は変化します。 |
| 飽和度 | バリアント | 特定の点での形状は、ピクセル領域の飽和によって決定されるため、実際の最終形状は変化します。 |
| 明るさ | バリアント | 特定の点での形状は、ピクセル領域の明るさによって決定されるため、実際の最終形状は異なります。 |
代表的なピクセル領域の各形状は押し出されるか拡大されます。押し出し深度または拡大サイズの決定は、ピクセル領域の色に依存します。
| カラーチャネル | 使用法 |
|---|---|
| 色相 | 色の色相は、3Dオブジェクトの深さ/サイズを決定します。色相値は周期的(0.0は本質的に1.0と同じ)であるため、赤みがかったピクセルが抑制される傾向があり、緑が強調表示されることに注意してください。 |
| 飽和 | 色の飽和値は深さ/サイズを決定します。明るい色が大きくなります。 |
| 輝度 | 色の明るさは深さ/サイズを決定します。これはデフォルト値であり、ほとんどの人がプログラムが機能することを期待する方法です。 |
| 赤 | 赤いチャネルは、深さ/サイズを決定するために使用されます。 |
| 緑 | 緑色のチャネルは、深さ/サイズを決定するために使用されます。 |
| 青 | 青いチャネルは、深さ/サイズを決定するために使用されます。 |
| シアン | 合成シアンチャネル(CMYKから)を使用して、深さ/サイズを決定します。 |
| マゼンタ | 合成マゼンタチャネル(CMYKから)を使用して、深さ/サイズを決定します。 |
| 黄色 | (CMYKから)合成黄色チャネルを使用して、深さ/サイズを決定します。 |
| 黒 | (CMYKから)合成ブラックチャネルを使用して、深さ/サイズを決定します。 |
| yuv:y | YUV変換からの合成Yチャネル。 |
| yuv:u | YUV変換からの合成Uチャネル。 |
| yuv:v | YUV変換からの合成Vチャネル。 |
Blockcamは逆旗をサポートします。これは、ユーザーが反転を設定する場合、深さ/サイズはそれ自体の往復であり、暗い領域を目立つようにし、明るい領域を抑制または隠します。
BlockCamは、光の色と光のタイプの変更をサポートします。色は現在、事前定義された色の小さなセットに制限されています。ライトの種類は、シーンキットの標準のノンパラメト化ライト( .omniや.spotなど)に並行しています。
ライトの位置は現在、ユーザーが調整することはできません。
BlockCamは、 SCNViewのallowsCameraControlフラグを使用して、ジェスチャーを介してユーザーが(3つの軸で)拡大、シンク、または回転できるようにします。
最初にレンダリングされると、結果はビューから比較的遠く離れているように見える場合があります。 BlockCamには、画像をビューに適合させるユーザーセット可能なフラグがあります。この機能は、拡大と縮小に関してallowsCameraControl混乱させる傾向があります。
このセクションでは、さまざまな実装レベルの詳細について説明します。
BlockCamはSwift 5でXcode 11.3で書かれています。
画像の処理にかかる時間がかかると、すべての画像処理はバックグラウンドスレッドで行われます。これには、適切なスレッドコールを使用してUIを介してユーザーを更新するためのすべての通信が必要です。
TBD
Blockcamは著作権©2019、2020 by Stuart Rankinです
日本語版«グーグル翻訳で翻訳»
3Dブロックカメラ
blockcam
blockcamはスチュアートランキンによって作成されました。
blockcamのバージョン管理はVersioning.swift
現在、バージョン管理プログラムはblockcamプロジェクトファイルのバージョン番号を更新しません。
最新のビルド:バージョン情報については、英語のセクションを参照してください。
バージョンとビルドの更新方法については、 githubの[versionupdater] https://github.com/sjrankin/versionupdater )リポジトリを参照してください。
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 | 弦 | "Initialized" | 設定が初期化されたかどうかを決定するフラグ。 BlockCamが最初に実行されるときに、 .Initializedがnilまたは空の場合、BlockCamが最初に実行されたと想定されるため、すべての設定のデフォルト値を書き込みます。 |
| .BlockSize | 整数 | 48 | 画像処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .ShapeType | 弦 | "Blocks" | 各ピクセル化領域の3Dオブジェクトと同じ。列挙型からキャストします。 |
| .InvertHeight | ブール | 間違い | 反転高さ/サイズ決定フラグ。 |
| .HeightSource | 弦 | "輝度" | 高さ/サイズを決定するために使用するカラーチャンネル。列挙型からキャストします。 |
| .ImageSizeConstraints | 弦 | "中くらい" | パフォーマンス上の理由から、処理する前に行う画像のサイズの縮小量を決定します。列挙型からキャストします。実行時に解釈される実際の値。 |
| .VerticalExaggeration | 弦 | "中くらい" | 3D形状を押し出しまたは拡大するときに実行する垂直方向の誇張の量。列挙型からキャストします。 |
| .InputQuality | 整数 | 2 | 入力品質を示す値。 0から3の範囲で、3が最高品質(および処理が最も遅い)です。 |
| .CurrentCamera | 弦 | "戻る" | 最後に使用したカメラの位置。前面または背面。列挙型からキャストします。 |
| .LightColor | 弦 | "白" | ライトの色の名前。列挙型からキャストします。後でカラーライブラリタイプの色に変換できます。 |
| .LightType | 弦 | "Omni" | シーンの照明に使用されるライトのタイプの名前。列挙型からキャストします。 |
| .LightIntensity | 弦 | "普通" | シーンを照らすために使用される光の強度。実行時に決定される実際の値。列挙型からキャストします。 |
| .FieldOfView | 弦 | "普通" | カメラの視野。実際の値は実行時に決定されます。列挙型からキャストします。 |
| .ShowHistogram | ブール | 間違い | ヒストグラム表示を表示します。現在実装されていません。 |
| .HistogramBucketCount | 整数 | 256 | ヒストグラム表示の色数。現在実装されていません。 |
| .InitialView | 弦 | "LiveView" | ユーザーが最後に表示したビュー(ライブビュー、アルバムなど)。 |
| .FullyExtrudeLetters | ブール | 真実 | 文字が完全に押し出されるか、部分的にのみ押し出されるかを決定します。 |
| .LetterSmoothness | 弦 | "スムーズ" | 文字の曲線をどれだけスムーズに作成するかを決定します。高品質の曲線には、大きなパフォーマンスコストがかかります。実行時に決定される実際の値。列挙型からキャストします。 |
| .LetterFont | 弦 | "Futura" | 押し出された文字のレンダリングに使用するフォント(およびオプションの太さ)。フォントがシステムに存在しない場合、BlockCamは未定義の状態に入ります。 |
| .RandomCharacterSource | 弦 | "ラテン" | 文字を押し出すときにランダムな文字のソースとして使用する名前付きUnicode範囲。複数の範囲を指定するには、それぞれをコンマで区切ります。 |
| .VideoFPS | 整数 | 1 | 現在使用されていません。 |
| .VideoDimensions | 弦 | "最小" | ビデオを生成するときの最終的なビデオサイズを決定します。実行時に決定される実際の値。列挙型からキャストします。 |
| .VideoBlockSize | 整数 | 48 | ビデオ処理のブロックサイズ。これは、ピクセル化された各領域の正方形のサイズです。 |
| .UseMetal | ブール | 真実 | OpenGLではなくMetalを使用するようにBlockCamに指示するフラグ。 |
| .AntialiasingMode | 整数 | 0 | アンチエイリアスモードを決定します。 |
| .InitialBestFit | ブール | 間違い | trueの場合、BlockCamは、すべてのノードをビューにできるだけ厳密に合わせようとします。 |
| .SaveOriginalImageAction | 弦 | "いつも" | 元の画像を保存する方法とタイミングを決定します。列挙型からキャストします。 |
| .NextSequentialInteger | 整数 | 0 | ファイル名の生成に使用。 |
| .LoopSequentialIntegerAfter | 整数 | 9999 | 連続する整数を使用する場合、いつループを開始するかを決定します。 |
| .StartSequentialIntegerAt | 整数 | 1 | 連続整数の開始値。 |
| .IncreaseStarApexesWithProminence | ブール | 間違い | trueの場合、星形の頂点の数は色の高さが顕著になるにつれて増加します。 |
| .StarApexCount | 整数 | 5 | 星の頂点の数。 .IncreaseStarApexesWithProminenceがtrueの場合、これは頂点の開始数です。 |
| .HaltWhenCriticalThermal | ブール | 真実 | trueの場合、BlockCamは重大な温度アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .HaltOnLowPower | ブール | 真実 | trueの場合、BlockCamは低電力アラートを受信すると停止します( fatalError呼び出しを介して)。これはAppleのガイドラインに違反する可能性があり、削除される可能性があります。 |
| .BestFitOffset | ダブル | 2.0 | .InitialBestFitがtrueの場合にカメラを後退させて、画像にもう少しネガティブなスペースを与えるために使用する値。 |
| .LightingModel | 弦 | "Phong" | 表面マテリアル照明モデル。列挙型からキャストします。 |
| .CappedLineBallLocation | 弦 | "トップ" | CappedLine形状のノードのボール(「キャップ」)の位置。列挙型からキャストします。 |
| .LoggingEnabled | ブール | 間違い | ロギングフラグを有効にします。 |
| .FontSize | 整数 | 36 | 押し出された文字のフォントサイズ。 |
| .EnableUISounds | ブール | 真実 | Flagは、UIサウンドを再生します(ボタンが押されたときなど)。 この値が「false」の場合、他のすべてのサウンドフラグは無視されます。 |
| .EnableShutterSound | ブール | 間違い | Flagは、カメラボタンが押されたときにシャッター音を再生します。 一部の地理的な場所では、これは常に発生し、この値を設定しても効果はありません。 |
| .EnableImageProcessingSound | ブール | 真実 | Flagは、画像処理の開始時と終了時に音声を再生します。 画像処理には時間がかかるため、ユーザーは画像がいつ完成するかを理解するのに役立ちます。 |
| .EnableVideoRecordingSound | ブール | 真実 | ユーザーがビデオの記録を開始および停止したときに音を再生するフラグ。 |
| .EnableButtonPressSounds | ブール | 真実 | ユーザーがボタンを押したときに音を再生するフラグ。 |
| .EnableOptionSelectSounds | ブール | 真実 | ユーザーが画面上の設定画面でオプションを選択したときに音を再生するフラグ。 |
| .EnableCrashSounds | ブール | 間違い | フラグは、クラッシュダイアログが表示されたときにサウンドを再生します。 #DEBUGモードでコンパイルされた場合のみ有効です。 |
| .MeshDotSize | 弦 | "中くらい" | メッシュの中心ドットのサイズ。 .Noneが使用される場合、中央のドットは表示されません。 列挙型からキャストします。 |
| .MeshLineThickness | 弦 | "中くらい" | メッシュラインの太さ。 列挙型からキャストします。 |
| .RadiatingLineThickness | 弦 | "中くらい" | 放射線形状の太さ。 列挙型からキャストします。 |
| .RadiatingLineCount | 整数 | 8 | 放射ライン形状の放射ラインの数。 「4」は基線方向を指す線、「8」は基線方向とその中間、および「16」はz平面のさらに8本の線を示します。 |
| .BlockChamferSize | 弦 | "なし" | ブロック形状の面取り半径/エッジの滑らかさ。 列挙型からキャストします。 |
| .MaxImageDimension | 整数 | 1024 | 画像の最大寸法。 処理する画像が大きい場合、最長寸法がこの値になるようにサイズ変更されます。 |
| .AddUserDataToExif | ブール | 間違い | Flagは、ユーザーが作成した情報を処理済み画像のExifブロックに追加します。 |
| .UserName | 弦 | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の名前。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します。 |
| .UserCopyright | 弦 | "" | (デフォルトは空白です。)処理された画像のExifブロックに追加されるユーザー指定の著作権文字列。 これは、 .AddUserDataToExifがtrueの場合にのみ発生します |
BlockCamは次のビジュアルをサポートしています。
現在、押し出し効果では次の形状がサポートされています(またはサポートされる予定です)。
| 形状 | ネイティブ | メモ |
|---|---|---|
| ブロック | はい- SCNBox | Z軸に沿って長くなったネイティブボックスの形状。 |
| 三角形 | いいえ | カスタム正三角形の形状。 |
| 五角形 | いいえ | カスタム正五角形。 |
| 六角形 | いいえ | カスタム正六角形。 |
| オクトゴン | いいえ | カスタム正八角形。 |
| ピラミッド | はい- SCNPyramid | ネイティブのピラミッド形状。 |
| トロイド | はい- SCNTorus | ネイティブトーラス形状。 |
| シリンダー | はい- SCNCylinder | 自然なシリンダー形状-すてきな高架円になります。 |
| 球 | はい- SCNSphere | ネイティブの球形。 |
| カプセル | はい- SCNCapsule | ネイティブカプセルの形状。聞こえるほど面白くない。 |
| 四面体 | いいえ | カスタム正四面体ソリッド。 |
| 星 | いいえ | カスタム星形(半径方向に等しい頂点を持つ)。頂点の数を変えることができます。 |
| CombinedForRGB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| CombinedForHSB | はい-組み合わせ | 球体、トーラス、カプセルの組み合わせ。 |
| メッシュ | いいえ | 現在実装されていません。 |
| レター | はい- SCNText | ネイティブの押し出しテキスト。特に非ラテン系のアルファベットでは、非常に遅くなる傾向があります。 |
| 行 | はい- SCNCapsule | 非常に薄いカプセル形状。 |
| CappedLines | はい-組み合わせ | ユーザー設定に応じて、行の上部、中間、または下部に球体を配置した非常に薄いカプセル形状。 |
| RadiatingLines | はい-組み合わせ | 中心点から放射状に広がる複数の線。 ユーザーは行数を指定できます。 これはパフォーマンス重視の形状です。 |
代表的なピクセル化領域の各形状は、押し出しまたは拡大されます。押し出しの深さまたは拡大サイズの決定は、ピクセル化された領域の色に依存します。
| カラーチャンネル | 使用方法 |
|---|---|
| 色相 | 色の色相は、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の実行を中止する設定を使用できます。
| イベント | アクション | 設定の制御 |
|---|---|---|
| サーマル | サーマルイベントがクリティカルステージ(通知では文字通り.critical )に達すると、設定がtrueの場合、BlockCamによって作成される熱ストレスを減らす致命的なエラーが生成されます。 | .HaltWhenTooHot |
| バッテリー | バッテリーが低電力状態になった場合、設定がtrueの場合、再充電前にバッテリーの寿命を保つために致命的なエラーが生成されます。 | .HaltOnLowPower |
BlockCamの著作権©2019, 2020 by Stuart Rankin