3D モデル

Kudan AR の 3D モデルの使用に関する情報


Unity

このページの説明は、iOS および Android SDK でレンダリングするためのものです。Kudan Unity プラグインでは Unity エンジンがすべてのレンダリングを処理するため、Unity と 3D モデルの詳細は、Unity のドキュメントをご覧ください。

サポートするファイル形式

Kudan AR は次のファイル形式をサポートします:

  • FBX (*.fbx)
  • OBJ (*.obj)
  • COLLADA (*.dae)

すべてのモデリング ソフトウェアは、これらのファイル形式に対応していますが、フレームワークを使用して最良の結果を得るためには Maya を推奨します。上記のファイル形式以外で作業する必要がある場合は、モデルを 3D モデリング ソフトウェアにインポートして、上記のいずれかのファイル形式でエクスポートします。

.FBX は最も安定しているファイル形式で、アニメーションとシーングラフをサポートしています。また、ほとんどのモデリング アプリケーションで広く使用され、サポートされています。.FBX ファイルをエクスポートする場合は、可能であれば バイナリー 形式を使用することを推奨します。ASCII形式もサポートされますが、最良の結果を得るためには バイナリー を使用してください。

OBJ は、シーングラフを表現することができず、アニメーションもサポートしていませんが、基本的な静的モデルに使用できる一般的な形式です。

COLLADA も多くのモデリング アプリケーションで広く使用されている形式です。ただし、モデルのエンドポイントではなく、中間形式として設計されているため、サポートされるいずれかの形式に再エクスポートすることを推奨します。

モデルの機能

メッシュ

最良の結果を得るためには、メッシュはポリゴンで作成すべきです。ポリゴン以外で作成したメッシュは、モデルのインポート時に変換されます。描画呼び出しとレンダーパスの数を減らしてレンダリングのパフォーマンスを向上するため、メッシュは単一のマテリアルにすべきです。メッシュの数が多いと GPU が非常に遅くなるため、パフォーマンスを考慮して一度にレンダリングされるメッシュの数は 50 未満になるようにします。ハードウェアの制限により、頂点が 65535 を超えるメッシュは分割されます。

ノード

FBX 形式では、複雑なシーングラフを利用できます。必須ではありませんが、シーンの各ノードには固有の名前を付けると便利です。

ボーン

スキン メッシュがサポートされています。iOS ではメッシュごとに 64 ボーン、Android では 32 ボーンのハードウェアによる制限がありますが、メッシュを分割することでそれ以上のボーンを使用できます。モデル コンバーターは、1 つの頂点が任意の数のボーンの影響を受けるメッシュをサポートしますが、レンダリングに使用されるのは 4 つ最もウェイトが高いボーンのみです。これが問題になることはまれですが、このような状況下では、モデルが正しく表示されることを確認すべきです。

ブレンド シェイプ/モーフ ターゲット

レンダラーは、ブレンド シェイプ (モーフ ターゲットとも呼ばれる) をサポートします。ブレンド シェイプはメッシュを変形させることができ、特にカメラ テクスチャ マッピング機能に最適です。

モバイル デバイス上でリアルタイムにレンダリングされるため、ブレンド シェイプには制限があります。同時に 2 つの異なるシェイプのみを混合できます。例えば、幸せな顔のブレンド シェイプと怒った顔のブレンド シェイプには、幸せな顔、怒った顔、通常の顔の 3 つのシェイプが含まれているため、混合することはできません。しかし、10 個の中間シェイプを持つ単一のシェイプは問題ありません。混合は、2 つのシェイプの間でのみ行われるためです。

アニメーション

FBX 形式では、アニメーションがインポートされます。次のプロパティはキー可能です:

  • ノードの変換
  • ノードの可視性
  • ブレンド シェイプの影響

現在、アニメーションのテイクはサポートされていないため、異なるアニメーション サイクルは個別のファイルに分割する必要があります。この機能は、将来サポートされる予定です。

アニメーションをベイクする必要はありません。また、実際に変更するチャンネルのみを指定する必要があります。

Android では、ARLightMaterial を使用する場合のみボーン アニメーションがサポートされます。その他のマテリアルやテクスチャは、ボーン アニメーションを正しく表示できません。

Kudan ARModel 形式

Kudan AR フレームワークは、.armodel 形式でのみ動作します。この形式は、ファイル サイズが小さく、高速にロードできます。.armodel ファイルは、Kudan AR ツールキットを使用して作成できます (Android でモデルを使用する場合、エクスポート ファイルの拡張子を .armodel から .jet に変更するか、ビルド Gradle の noCompress ブロックに .armodel を含める必要があります)。テクスチャは、アプリとは別にバンドルされます。

ARModel ファイルは、ARModelImporter クラスを利用してロードできます:

SwiftJavaObjective-C
let importer = ARModelImporter(bundled: "test.armodel")
let modelNode: ARModelNode? = importer.getNode()
ARModelImporter importer = new ARModelImporter();
importer.loadFromAsset("test.jet");
ARModelNode modelNode = importer.getNode();
ARModelImporter *importer = [[ARModelImporter alloc] initWithBundled:@"test.armodel"];
ARModelNode *modelNode = [importer getNode];

生成された ARModelNode は、レンダリングするため、ほかのノードに追加することができます。

テクスチャ
テクスチャの最大サイズは 2048x2048px、色深度は 8 ビットに制限されます。サイズは 2 の累乗でなければなりません。

Android
Android では、ファイルが圧縮されるのを防ぐため、モデル アセットのファイル拡張子を “.jet” に変更する必要があります。

マテリアル

マテリアルはレンダラーとともに使用され、オブジェクトの表示方法を定義します。

ライト マテリアル

これは、フォン シェーディングの実装です。これらのマテリアルは、ARMaterialPropererties のコレクションで構成されます。ほとんどのプロパティでは、float 係数で乗算されたマテリアル全体のユニフォーム値を格納する ARVector 値、またはライティングに使用可能なモデルまたはマップにカラー テクスチャを適用する ARTexture 値を使用できます。

ARLightMaterials のみがライティングの影響を受けます。ほかのすべてのマテリアルはシーンのライティングを無視します。

ライト マテリアルには、次のプロパティがあります:

  • colour – サーフェスの基本色を表す、マテリアルのメイン カラー テクスチャです。このパラメーターにベクトルを使用して単色を指定することは可能ですが、通常はテクスチャ マップを割り当てます。このパラメーターには、オブジェクトのサーフェスの色を指定します。テクスチャ マップを使用する場合は、ライティングが設定されていないことを確認します。ライティングは、ARLights とほかのマテリアル パラメーターの組み合わせによって追加されます。
  • blendTexture – マテリアルを変換するためにロード可能な代替テクスチャです。blendParameter を使用して、描画内のテクスチャをブレンドする色の比率を決定します。
  • ambient – マテリアル全体を照らす環境光です。「最小ライト レベル」と考えることができます。ベクトルを使用してユニフォーム ライティング、またはテクスチャとして渡されるマップを設定できます。
  • diffuse – 拡散照明 (ディフューズ ライティング) はシンプルなライティング モデルを計算します。サーフェスとライトの間の角度が小さくなるにつれて、サーフェスのライティングは減ります。ライティングはこの角度にのみ依存し、カメラが動いたり回転しても変化しません。マテリアルに適用される拡散照明には、ベクトルを使用してユニフォーム拡散照明、またはテクスチャとして渡される拡散マップ (ディフューズ マップ) を設定できます。
  • reflection – このプロパティは、マテリアルの反射率とオブジェクトに反射する物を制御します。環境マップと反射率の 2 つのプロパティがあり、これらは画像ベースの反射と屈折に使用されます。環境マップ変数は、マテリアルの周囲の環境をシミュレーションするテクスチャ キューブであり、反射を発生させるために割り当てる必要があります。
  • normal – ノーマル マップは、バンプ マップの一種です。バンプ マップとは、実際のジオメトリで表されるかのように、光を当てるモデルにバンプ、グルーブ、スクラッチなどのサーフェス ディテールを追加できる特別な種類のテクスチャです。マテリアルで使用するノーマル マップは、テクスチャを使用して設定する必要があります。
  • shininess – 光沢パラメーターは、マテリアルによって反射される反射光 (スペキュラ ライト) の量に影響を与えます。値を小さくするとマテリアルの光沢が弱くなり、値を大きくすると光沢が強くなります。
  • alpha – アルファ値は、マテリアルの透明度レベルを制御します。この値は、透過が有効なマテリアルにのみ影響を与えます。
  • blendParameter – カラー テクスチャのブレンドに使用される float です。デフォルトは 0 (カラー テクスチャ)で、1 はブレンド テクスチャを表します。
  • refractivityRatio – ライトが媒体に入るときと出るときの屈折率の比率を表します。
  • maxLights – シーン内でマテリアルを照らすことができる動的ライトの数を表します。ライトの数を多くすると、計算量が増えてフレーム レートが低下します。
  • perPixelShader – ライティング計算を頂点単位で行うか、ピクセル単位で行うかを指定します。ピクセル単位のライティング計算は、優れたビジュアル効果が得られますが、パフォーマンスが低下します。ノーマル マップや正確な動的ライティングなどの一部のライティング関数は、頂点単位のライティングでは利用できません。

カラー マテリアル

カラー マテリアルは、ライティングが設定されていない単色のシンプルなマテリアルです。ライト マテリアルの colour プロパティにベクトルを割り当てて、ambient ライティングを 1 に設定することでも同様の効果が得られますが、オーバーヘッドが低いカラー マテリアルの使用を推奨します。

テクスチャ マテリアル

テクスチャ マテリアルは、テクスチャ マップと画像を使用して作成される、ライティングが設定されていないシンプルなマテリアルです。このマテリアルは、プログラムで変更可能な透過をサポートします。また、ARImageNode で画像の表示に使用されます。

オクルージョン マテリアル

オクルージョン マテリアルは、シーンの特定の部分を隠します。例えば、カメラ テクスチャの一部で CG コンテンツを塞いで、マーカーに穴を作成したり、現実世界のオブジェクトの後ろでモデルが動いているかのように見せることができます。

マテリアルの操作

マテリアルはプログラムで作成して、メッシュに割り当てる必要があります。シーンのメッシュは、ARMeshNodes で表されます。ARMeshNodes には、レンダリングするマテリアルを指定するプロパティがあります。

3D モデルのすべてのメッシュ ノードは、ARModelNode の meshNodes プロパティでグループ化されます。以下は、テクスチャ マテリアルを作成してメッシュに割り当てる簡単な例です:

SwiftJavaObjective-C
let modelImporter = ARModelImporter(bundled: "example.armodel")

let modelNode: ARModelNode? = modelImporter.getNode()

let meshNode: ARMeshNode? = modelNode?.findMeshNode("Example Mesh")

let texture = ARTexture(uiImage: UIImage(named: "exampleTexture.jpg"))

let textureMaterial = ARTextureMaterial(texture)

meshNode?.material = textureMaterial
ARModelImporter modelImporter = new ARModelImporter();
modelImporter.loadFromAsset("example.armodel");

ARModelNode modelNode = modelImporter.getNode();

ARMeshNode meshNode = modelNode.getMeshNodes()[0];

ARTexture2D texture = new ARTexture2D(); 
texture.loadFromAsset("exampleTexture.jpg");

ARTextureMaterial *textureMaterial = new ARTextureMaterial(texture);

meshNode.setMaterial(textureMaterial);
ARModelImporter *modelImporter = [[ARModelImporter alloc] initWithBundled:@"example.armodel"];

ARModelNode *modelNode = [modelImporter getNode];

ARMeshNode *meshNode = [modelNode findMeshNode:"Example Mesh"];

ARTexture *texture = [[ARTexture alloc] initWithUIImage:[UIImage imageNamed:@"exampleTexture.jpg"]];

ARTextureMaterial *textureMaterial = [ARTextureMaterial materialWithTexture:texture];

meshNode.material = textureMaterial;

抽出されたカメラ テクスチャ

抽出されたカメラ テクスチャは、マテリアルで使用可能なテクスチャの一種です。ライブ カメラ テクスチャの一部を取得して、レンダリングの一部として使用できるようにします。現実世界の画像のライティングやノイズと完全に一致させることで現実感を維持しながら、カメラ画像を変形して躍動感を与えるのに役立ちます。詳細は、コード サンプル と API ドキュメントをご覧ください。

実物大モデル

ArbiTrack を使用して 3D モデルを実物大で表示するには、オブジェクトの実際のサイズを把握する必要があります。

Kudan AR エンジンでは、3D モデリング アプリケーション内と同様に、任意のユニット (単位) を使用できます。

デフォルトでは、Kudan AR を使用する場合、カメラの高さは 120 に設定されます。一般に、これは 120cm であると考えられますが、12 インチまたは 12cm と解釈することもできます。常に同じユニットを使用し、一貫してこのスケールを 3D モデルに適用する必要があります。

ここでは、1 ユニットは 1cm であるとします。120x120x120 ユニットの 3D ボックスを作成する場合、それはカメラの高さに達する立方体として表示されるはずです。各辺が 5 ユニットの立方体があり、実際のサイズが 130cm の場合、次の計算を行います:

実際のサイズ / ユニット サイズ = ユニフォーム スケール値

130/5 = 26

最適化

レンダラーは 100 万個を超える三角形を含む非常に細かい 3D モデルを処理できますが、パフォーマンスを向上するため、特に低電力のデバイスでは次のことを行うことができます:

  • 三角形の数を減らします。100,000 を目標にすると良いでしょう。
  • 異なるマテリアルの数を減らし、同一のマテリアルのメッシュを結合します。多数の異なるテクスチャを使用する代わりに、それらをアトラスに圧縮してメッシュ全体で共有します。
  • ボーンのほうがブレンド シェイプよりも効率的です。ボーンで変形を行うことができる場合はそうすべきです。そのほうが良いアプローチです。
  • シンプルなジオメトリのノーマル マップを使用するようにします。これにより、モデル ファイルのサイズも大幅に削減できます。
  • 可能な限りマテリアルを共有するようにします。同じ画像がシーンの複数の場所で表示される場合、その画像は一度だけロードすべきです。ARMaterial インスタンスは、複数のメッシュで共有することができます。

将来予定されている機能

これらの機能は、現在開発中であり、今後公開される予定です:

  • カスタム シェーダー サポート
  • リアルタイム シャドウ
  • ブレンド シェイプの混合
  • 後処理効果