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

传统上,当您想要移动模型时,您所做的不是修改模型的每个顶点,而是更改 World 矩阵。

在 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 回答