2

モデルの向きが正しくわかりません。このプロジェクトでは、ユーザーは3つのDXFファイルをロードします。

  • DXF 1は、3dfacesで表されるモデルです。
  • DXF 2は、左側通行としてのカメラのパスを表す3dpolyです。
  • DXF 3は、対向トラフィックのパスを提供する3dpolyです。

最初の2つのデータセットは、C#/XNA開発で正しく処理されます。ユーザーは、キーボードの上下のキーを使用して道路に沿って運転できます。しかし、私は3番目のプロセスで失敗します。対向車の向きがわかりません。位置は問題ありません。100メートルごとに1台のバンがありますが、向きが間違っています。

最も奇妙なのは、モデルを正しい場所に変換する通常の方法であり、向きによってモデルがカメラの上に配置されます。どこで私は間違えましたか?次のURLでソースコードを利用できるようにしたので、コードを表示して、どこで問題が発生したかを確認できます(zipにはテストに使用したDXFファイルが含まれています)。

http://www.4shared.com/zip/Lk3xmCtO

よろしくお願いします。ケビン。

これは最も間違った部分です:

Matrix worldMatrix = Matrix.CreateTranslation(VanPos[vi]);
Matrix[] transforms = new Matrix[Van.Bones.Count];
Van.CopyAbsoluteBoneTransformsTo(transforms);
foreach (ModelMesh modmesh in Van.Meshes)
{
foreach (BasicEffect be1 in modmesh.Effects)
{
    be1.World = transforms[modmesh.ParentBone.Index] * worldMatrix;

これにより、モデルがカメラの位置に配置されます。CreateTranslationだけを使用すると、モデルが正しい場所に配置されますが、向きが正しくありません。

4

1 に答える 1

1

向きを設定することはありません。つまり、コンテンツが回転することはありません。私が配置しているいくつかのコードから、これがモデルメッシュを描画する方法です。

キーポイント:

  • 投影とビューのマトリックスを含めて、それらを効果に設定する必要があります。次のコードでこれを行うことができます。
  • マトリックスを作成するOrientation必要があります。これを行うのに役立つ便利な機能がたくさんありますMatrix.CreateRotationY
  • 行列を乗算するときは、順序に注意してください。あなたはこれに気づいたと思いますが、順序は本当に重要です。私はこれを台無しにして、物事を機能させるために乗算の順序をいじくり回す傾向があります:)

    public void Draw(Matrix projection, Matrix view)
    {
        // Copy any parent transforms.
        var transforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(transforms);
    
        foreach (var mesh in model.Meshes)
        {
            // This is where the mesh orientation is set, as well 
            // as our camera and projection.
            foreach (BasicEffect effect in mesh.Effects)
            {
                Matrix world = Orientation; // <- A Matrix that is the orientation
                world.Translation = Position; // <- A Vector3D representing position
                effect.World = transforms[mesh.ParentBone.Index] *
                    world;
    
                effect.View = view;
                effect.Projection = projection;
            }
            // Draw the mesh, using the effects set above.
            mesh.Draw();
        }
    }
    
于 2012-08-31T06:26:17.413 に答える