3d 在xna中定位三维对象
我是xna开发的新手,希望通过将位置向量传递给构造函数来定位数据集。。不幸的是,它不起作用。。相反,它只是在旋转 我就是这样修改cubeprimitive类的代码的: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
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);
请注意相反的顺序-首先要平移模型,然后围绕原点旋转