3d 在xna中定位三维对象

3d 在xna中定位三维对象,3d,xna,cube,primitive,3d,Xna,Cube,Primitive,我是xna开发的新手,希望通过将位置向量传递给构造函数来定位数据集。。不幸的是,它不起作用。。相反,它只是在旋转 我就是这样修改cubeprimitive类的代码的: public class CubePrimitive : GeometricPrimitive { public Vector3 position; /// <summary> /// Constructs a new cube primitive, using default setti

我是xna开发的新手,希望通过将位置向量传递给构造函数来定位数据集。。不幸的是,它不起作用。。相反,它只是在旋转

我就是这样修改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);
    }
}
公共类CubePrimitive:GeometricPrimitive
{
公共向量3位置;
/// 
///使用默认设置构造新的多维数据集基本体。
/// 
公共立方体限制性(图形设备图形设备)
:此(图形设备,1,新矢量3(-3,0,0))
{
}
/// 
///构造具有指定大小的新多维数据集基元。
/// 
公共立方体限制(图形设备图形设备、浮点大小、矢量3位置)
{
这个位置=posi;
//立方体有六个面,每个面指向不同的方向。
向量3[]法线=
{
新矢量3(0,0,1),
新矢量3(0,0,-1),
新矢量3(1,0,0),
新矢量3(-1,0,0),
新矢量3(0,1,0),
新向量3(0,-1,0),
};
//依次创建每个面。
foreach(法线中的向量3法线)
{
//获取两个垂直于面法线且彼此垂直的向量。
Vector3 side1=新的Vector3(正常.Y,正常.Z,正常.X);
向量3侧2=向量3交叉(正常,侧1);
//每个面有六个索引(两个三角形)。
AddIndex(CurrentVertex+0);
AddIndex(CurrentVertex+1);
AddIndex(CurrentVertex+2);
AddIndex(CurrentVertex+0);
AddIndex(CurrentVertex+2);
AddIndex(CurrentVertex+3);
//每个面有四个顶点。
AddVertex(posi+(正常-侧1-侧2)*大小/2,正常);
AddVertex(位置+(法线-边1+边2)*大小/2,法线);
AddVertex(位置+(法线+边1+边2)*大小/2,法线);
AddVertex(位置+(法线+边1-边2)*大小/2,法线);
}
初始化限制(图形设备);
}
}

你能告诉我如何正确修改它吗。。提前感谢:)

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

在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);
请注意相反的顺序-首先要平移模型,然后围绕原点旋转