在XNA位置的3D对象 [英] Position 3d objects in xna

查看:138
本文介绍了在XNA位置的3D对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是pretty的新XNA的开发,并想从的 Primitives3D样品传递一个位置向量来构造 ..不幸的是它不工作..相反,它只是旋转以防万一。

I'm pretty new to xna development and want to position the Cubes from the Primitives3D sample by passing a position vector to the constructor .. unfortunatly it does not work .. instead it is just spinning arround..

这就是我如何修改cubeprimitive类的code:

Thats how i modified the code of the cubeprimitive class:

  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);
    }
}

能否请你告诉我如何正确地对其进行修改? ..在此先感谢:)

Can you please show me how to modify it correctly? .. thanks in advance :)

推荐答案

传统上你做什么,当你要移动一个模型解决方法是,而不是修改每个模型的顶点,你改变了世界矩阵。

Traditionally what you do when you want to move a model around is, instead of modifying each of the vertices of the model, you change the World matrix.

查找此行Primitives3DGame.cs:

Find this line in Primitives3DGame.cs:

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

和改变它的东西是这样的:

And change it to something like this:

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

(当然,去掉你做,因为张贴在你的问题的变化。)

(And, of course, remove the change you have made, as posted in your question.)

据我可以告诉你的code为实际工作。但是,也许你期待立方体旋转,但留在同一个地方(这是上面的code一样)。你在做什么是有效的一样:

As far as I can tell your code is actually working. But perhaps you were expecting the cube to rotate but stay in the same place (which is what the above code does). What you are doing is effectively the same as:

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

请注意相反的顺序 - 你正在做模型的转换第一和然后的绕原点旋转

Note the reversed order - you're doing the translation of your model first and then rotating around the origin.

这篇关于在XNA位置的3D对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆