Расположите 3d объекты в xna - PullRequest
0 голосов
/ 11 июля 2010

Я довольно новичок в разработке 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);
    }
}

Можете ли вы показать мне, как его правильно изменить?.. заранее спасибо:)

1 Ответ

1 голос
/ 11 июля 2010

Традиционно, когда вы хотите перемещать модель, вместо того, чтобы изменять каждую из вершин модели, вы изменяете матрицу мира.

Найдите эту строку в 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);

Обратите внимание на обратный порядок - сначала выполняется перевод вашей модели, а затем , а затем , вращающийся вокруг начала координат.

...