在其轴上旋转3D对象,与世界轴 - XNA相对

时间:2010-06-20 19:39:02

标签: c# xna

嘿所有,我一直在XNA的这个小项目上工作,目标非常基础 我有一个3D模型在屏幕上的某个地方弹出,该对象假设在它的y轴上旋转,

问题是: 相反的是,模型围绕自身旋转,并开始在它们自身与屏幕中的0,0,0点之间的中间点进行轨道运动,因此看起来中间模型正常旋转而另外两个模型在前面运行提到的方式(包括以下旋转模型的img)。

“一些”更多细节

我的架构是这样的,我有3个模型(他们采取游戏,位置,大小@他们的ctor)

private void initDradles()
    {
        m_Dradles[0] = new DradlePositionColor(this, new Vector3(15, 0, 0), 8);
        m_Dradles[1] = new DradlePositionColor(this, new Vector3(0, 0, 0), 8);
        m_Dradles[2] = new DradlePositionColor(this, new Vector3(-15, 0, 0), 8);
        this.Components.Add(m_Dradles[0]);
        this.Components.Add(m_Dradles[1]);
        this.Components.Add(m_Dradles[2]);
    }

这些模型首先以图1中所示的方式出现在屏幕上

它们都共享相同的BasicEffect着色器,但具有不同的世界矩阵

基本效果创建和模型分配

protected override void Initialize()
    {
        float k_NearPlaneDistance = 0.5f;
        float k_FarPlaneDistance = 1000.0f;
        float k_ViewAngle = MathHelper.PiOver4;

        // we are storing the field-of-view data in a matrix:
        m_ProjectionFieldOfView = Matrix.CreatePerspectiveFieldOfView(
            k_ViewAngle,
            GraphicsDevice.Viewport.AspectRatio,
            k_NearPlaneDistance,
            k_FarPlaneDistance);

        // we want to shoot the center of the world:
        Vector3 targetPosition = new Vector3(0, 0, 0);//Vector3.Zero;
        // we are standing 100 units in front of our target:
        Vector3 pointOfViewPosition = new Vector3(0, 0, 130);
        // we are not standing on our head:
        Vector3 pointOfViewUpDirection = new Vector3(0, 1, 0);

        // we are storing the point-of-view data in a matrix:
        m_PointOfView = Matrix.CreateLookAt(
            pointOfViewPosition, targetPosition, pointOfViewUpDirection);

        base.Initialize();
    }

    protected override void LoadContent()
    {
        // we are working with the out-of-the box shader that comes with XNA:
        m_BasicEffect = new BasicEffect(this.GraphicsDevice, null);
        m_BasicEffect.View = m_PointOfView;
        m_BasicEffect.Projection = m_ProjectionFieldOfView;
        m_BasicEffect.VertexColorEnabled = true;

        // we are working with colored vertices
        GraphicsDevice.VertexDeclaration = new VertexDeclaration(
            GraphicsDevice, VertexPositionColor.VertexElements);

        // we did not use certain clockwise ordering in our vertex buffer
        // and we don't want antthing to be culled away..
        this.GraphicsDevice.RenderState.CullMode = CullMode.None;

        foreach (var dradle in m_Dradles)
        {
            dradle.BasicEffect = m_BasicEffect;
        }

        base.LoadContent();
    }

在每个模型中,更新方法中包含以下代码:

private void BuildWorldMatrix()
    {
        m_WorldMatrix = Matrix.Identity;
        m_WorldMatrix *= Matrix.CreateScale(m_Scales);
        m_WorldMatrix *= Matrix.CreateRotationX(m_Rotations.X);
        m_WorldMatrix *= Matrix.CreateRotationY(m_Rotations.Y);
        m_WorldMatrix *= Matrix.CreateRotationZ(m_Rotations.Z);
        m_WorldMatrix *= Matrix.CreateTranslation(m_Position);
            ///*I*/ Matrix.Identity *
            ///*S*/ Matrix.CreateScale(m_Scales) *
            ///*R*/ Matrix.CreateRotationX(m_Rotations.X) *
            //        Matrix.CreateRotationY(m_Rotations.Y) *
            //        Matrix.CreateRotationZ(m_Rotations.Z) *
            ///* No Orbit */
            ///*T*/ Matrix.CreateTranslation(m_Position);
    }

    public override void Update(GameTime gameTime)
    {
        m_Rotations.Y += (float)gameTime.ElapsedGameTime.TotalSeconds;
        BuildWorldMatrix();

        base.Update(gameTime);
    }

和draw方法中的代码

public override void Draw(GameTime gameTime)
    {
        m_BasicEffect.World = m_WorldMatrix;
        m_BasicEffect.Begin();
        foreach (EffectPass pass in m_BasicEffect.CurrentTechnique.Passes)
        {
            pass.Begin();
            Render();
            pass.End();
        }
        m_BasicEffect.End();

        base.Draw(gameTime);
    }

    public override void Render()
    {
        renderVerticesBox(m_BodyVertices);
        renderVerticesBox(m_HandleVertices);
        Game.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(
            PrimitiveType.TriangleFan, m_PyramidVertices, 0, 4);
    }

    private void renderVerticesBox(VertexPositionColor[] m_Vertices)
    {
        Game.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(
            PrimitiveType.TriangleStrip, m_Vertices, 0, 8);

        Game.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(
            PrimitiveType.TriangleStrip, m_Vertices, 10, 2);

        Game.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(
            PrimitiveType.TriangleStrip, m_Vertices, 14, 2);
    }

旋转时的图像 alt text http://www.freeimagehosting.net/uploads/b0aa83d0d6.png

启动时的图像

alt text http://www.freeimagehosting.net/uploads/ee9e5c379c.png

1 个答案:

答案 0 :(得分:1)

我认为你需要移动你的行

m_WorldMatrix *= Matrix.CreateTranslation(m_Position);

向上几行,在应用旋转矩阵之前执行此操作。