1

Apple の SceneKit ライブラリを使用して簡単なレーシング ゲームを作成中です。レース トラックの左折セクションをモデル化しました。モデルを SCNGeometry に正常にロードしてレンダリングすることができます。ただし、このモデルを左折セグメントと右折セグメントの両方に使用できるようにしたいと考えています。これを行うには、yz 平面上で SCNGeometry をミラーリングする必要がありますが、私の人生ではその方法を理解することはできません。

SpriteKit では、対応する SKNode のスケールを -1 に設定することで、スプライトをミラーリングできます。ただし、SCNGeometry の SCNNode の x スケールを -1 に設定すると、SCNGeometry はまったくレンダリングされません。モデリング ソフトウェアでモデルをミラーリングすることはできますが、2 つの基本的に同一のモデルを使用することは避けたいと考えています。任意の提案をいただければ幸いです。

4

3 に答える 3

2

SCNNode の x スケールを -1 に設定すると、実際には SCNGeometry がミラーリングされます。問題は、SCNGeometry がそのようにミラーリングされると、すべての面が外側ではなく内側に向けられるため、何もレンダリングされないことです。背面ではなく前面がカリングされるようにオブジェクトのマテリアルが変更された場合、SCNGeometry は期待どおりにミラーリングされます。

于 2014-06-14T16:54:22.363 に答える
1

ジオメトリを変更したくないが、テクスチャだけを変更したい場合は、次のことができます。

let flip = SCNMatrix4Translate(
        SCNMatrix4Scale(material.diffuse.contentsTransform, 1.0, -1.0, 1.0),
        0, 1, 0
    )
material.diffuse.contentsTransform = flip

または直接、

material.diffuse.contentsTransform = SCNMatrix4FromGLKMatrix4(GLKMatrix4(m: (
  -1.0, 0.0, 0.0, 0.0,
  0.0, 1.0, 0.0, 0.0,
  0.0, 0.0, 1.0, 0.0,
  -1.0, 0.0, 0.0, 1.0
)))

これにより、反転するテクスチャx座標が置き換えられます。1-x私はシェーダーをいじってみました.SceneKitがコンテンツ変換をどのように使用するかを示す関連するシェーダーコードは

v_texcoord0 = (u_diffuseTextureMatrix * vec4(_geometry.texcoords[0], 0., 1.)).xy;

こちらをご覧ください

于 2016-09-02T19:03:09.953 に答える