2

でテンプレートのセットアップをいじっているだけMTKViewです。そして、私は次のことを理解しようとしています:

  1. カメラのデフォルトの位置。

  2. MDLMeshとを使用してプリミティブを作成するときのデフォルトの場所MTKMesh

  3. 回転に平行移動が含まれるのはなぜですか。

関連コード:

matrix_float4x4 base_model = matrix_multiply(matrix_from_translation(0.0f, 0.0f, 5.0f), matrix_from_rotation(_rotation, 0.0f, 1.0f, 0.0f));
matrix_float4x4 base_mv = matrix_multiply(_viewMatrix, base_model);
matrix_float4x4 modelViewMatrix = matrix_multiply(base_mv, matrix_from_rotation(_rotation, 0.0f, 1.0f, 0.0f));

上記のコードは_update、テンプレートによるメソッドからのものです。明らかに、カメラの代わりにモデルを回転させようとしています。しかし、私を困惑させているのは、翻訳も必要であるという事実です。「常に回転するから」などの主張を読んだことがあります(0, 0, 0)。しかし(0, 0, 0)、オブジェクトが別の場所に配置されている場合、なぜでしょうか? また、次のように変更すると、カメラは通常の負の z 軸ではなく、正の z 軸 (質問 1 ) を見ているように見えます。

matrix_float4x4 base_model = matrix_multiply(matrix_from_translation(0.0f, 0.0f, 5.0f), matrix_from_rotation(_rotation, 0.0f, 1.0f, 0.0f));

に:

matrix_float4x4 base_model = matrix_multiply(matrix_from_translation(0.0f, 0.0f, -5.0f), matrix_from_rotation(_rotation, 0.0f, 1.0f, 0.0f));

オブジェクトがカメラの後ろにあるように見えるため、画面には何も表示されません。これは、カメラが正の z 軸を見ていることを意味します。

(すべてゼロ)を設定すると、オブジェクトは期待どおりにmatrix_from_translation(0.0f, 0.0f, 0.0f)y 軸 (質問 3 ) 上で回転しません。

MDLMeshandMTKMeshがデフォルトで配置されている場所を見つけようとしましたが(質問 2 )、その位置を記録するプロパティが見つかりませんでした。以下は、同じくテンプレートによる、プリミティブの作成方法です。

MDLMesh *mdl = [MDLMesh newBoxWithDimensions:(vector_float3){2,2,2} segments:(vector_uint3){1,1,1}
                geometryType:MDLGeometryTypeTriangles inwardNormals:NO
                allocator:[[MTKMeshBufferAllocator alloc] initWithDevice: _device]];

_boxMesh = [[MTKMesh alloc] initWithMesh:mdl device:_device error:nil];

上記の方法で生成された位置を知らなければ、回転と移動がどのように機能するか、Metal のカメラのデフォルトの位置を理解するのに役立ちます。

ありがとう。

4

1 に答える 1

3

コード内で行列が記述されている順序が意図をやや不明瞭にしていると思うので、説明を簡単にするために、実際に何が起こっているかを次の擬似コードに要約しました。

最後のマトリックスをテンプレートのマトリックスに置き換えました。これは、変更によって Y 軸の回転が 2 倍になるだけだからです。

modelViewMatrix = identity *
                  translate(0, 0, 5) *
                  rotate(angle, axis(0, 1, 0)) *
                  rotate(angle, axis(1, 1, 1))

マトリックスはシェーダーのベクトルの左側で乗算されるため、マトリックスを右から左に読み取って、それらの累積効果を判断します。

まず、原点を斜めに通る軸 (1, 1, 1) を中心に立方体を回転させます。次に、Y 軸を中心に立方体を回転させます。これらの回転を組み合わせて、一種の「タンブル」アニメーションを形成します。次に、立方体を +Z 軸に沿って 5 単位移動します (ご覧のとおり、この世界は左利きと見なされているため、これは画面に入ります)。最後に、恒等行列になるようにハードコードされたカメラ変換を適用します。+Z に沿って追加の正の移動をカメラ マトリックスとして使用して、立方体をカメラからさらに遠ざけるか、負の値を使用して立方体を近づけることができます。

質問に答えるには:

  1. そのように考えたい場合は、原点(0、0、0)以外にカメラのデフォルトの場所はありません。ワールド内でカメラがどのように配置されるかを表す変換の逆数を頂点位置に掛けることで、ワールド内でカメラを「配置」します。

  2. モデル I/O は、生成される形状にとって意味のある範囲で、原点を中心に「中心に配置された」メッシュを構築します。円柱、楕円体、およびボックスは実際には原点を中心に配置されますが、円錐は頂点が原点にあり、軸が -Y に沿って伸びるように作成されます。

  3. 回転は、それと組み合わされているため、実際には平行移動を伴いません。平行移動の理由は、立方体をカメラから離して配置する必要があるためです。そうしないと、描画時にその中にいることになります。

操作の順序に関する最後の注意:回転のに平行移動を適用すると、ボックスがカメラの周りを「周回」することになります。

于 2016-10-25T01:06:38.537 に答える