views:

55

answers:

1

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..

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 :)

+1  A: 

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.

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.)

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.

Andrew Russell