0

私はxna開発にかなり慣れていないので、コンストラクターに位置ベクトルを渡すことによってPrimitives3Dサンプルからキューブを配置したいと思います..残念ながらそれは機能しません..代わりにそれはただ回転しているだけです..

それが私がcubeprimitiveクラスのコードを変更した方法です:

  public class CubePrimitive : GeometricPrimitive
{
    public Vector3 position;

    /// <summary>
    /// Constructs a new cube primitive, using default settings.
    /// </summary>
    public CubePrimitive(GraphicsDevice graphicsDevice)
        : this(graphicsDevice, 1, new Vector3(-3,0,0))
    {
    }

    /// <summary>
    /// Constructs a new cube primitive, with the specified size.
    /// </summary>
    public CubePrimitive(GraphicsDevice graphicsDevice, float size, Vector3 posi)
    {
        this.position = posi;

        // A cube has six faces, each one pointing in a different direction.
        Vector3[] normals =
        {
            new Vector3(0, 0, 1),
            new Vector3(0, 0, -1),
            new Vector3(1, 0, 0),
            new Vector3(-1, 0, 0),
            new Vector3(0, 1, 0),
            new Vector3(0, -1, 0),
        };

        // Create each face in turn.
        foreach (Vector3 normal in normals)
        {
            // Get two vectors perpendicular to the face normal and to each other.
            Vector3 side1 = new Vector3(normal.Y, normal.Z, normal.X);
            Vector3 side2 = Vector3.Cross(normal, side1);

            // Six indices (two triangles) per face.
            AddIndex(CurrentVertex + 0);
            AddIndex(CurrentVertex + 1);
            AddIndex(CurrentVertex + 2);

            AddIndex(CurrentVertex + 0);
            AddIndex(CurrentVertex + 2);
            AddIndex(CurrentVertex + 3);

            // Four vertices per face.
            AddVertex(posi+(normal - side1 - side2) * size / 2, normal);
            AddVertex(posi + (normal - side1 + side2) * size / 2, normal);
            AddVertex(posi + (normal + side1 + side2) * size / 2, normal);
            AddVertex(posi + (normal + side1 - side2) * size / 2, normal);
        }

        InitializePrimitive(graphicsDevice);
    }
}

正しく修正する方法を教えてください。.. 前もって感謝します :)

4

1 に答える 1

1

従来、モデルを移動したいときに行うことは、モデルの各頂点を変更する代わりに、ワールドマトリックスを変更することです。

Primitives3DGame.csでこの行を見つけます。

Matrix world = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll);

そして、次のように変更します。

Matrix world = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll)
               * Matrix.CreateTranslation(-3, 0, 0);

(もちろん、質問に投稿されているように、行った変更を削除します。)

私が知る限り、あなたのコードは実際に機能しています。しかし、おそらくあなたは立方体が回転することを期待していましたが、同じ場所にとどまります(これは上記のコードが行うことです)。あなたがしていることは事実上次と同じです:

Matrix world = Matrix.CreateTranslation(-3, 0, 0)
               * Matrix.CreateFromYawPitchRoll(yaw, pitch, roll);

逆の順序に注意してください。最初にモデルの平行移動を実行してから、原点を中心回転します。

于 2010-07-11T16:26:21.110 に答える