【问题标题】:how to move 3d object in XNA?如何在 XNA 中移动 3d 对象?
【发布时间】:2012-02-11 13:44:05
【问题描述】:

我想移动一个 3d 汽车模型,当我按向左或向右箭头键时,我改变了角度,当我按向上箭头时,汽车行驶。

这是更新方法中的代码:

float dirX = (float)Math.Sin(angle);
float dirY = (float)Math.Cos(angle);

if (Keyboard.GetState().IsKeyDown(Keys.Up))
        {
            position += new Vector3(-dirX, dirY, 0);

            if (Keyboard.GetState().IsKeyDown(Keys.Left))
            {
                angle += 0.015f;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Right))
            {
                angle -= 0.015f;
            }
        }

这是计算部分,但显然我还需要在屏幕上移动汽车。 我想让汽车向前移动,而不是向上,所以我想我应该在 X 轴上将它旋转 90 度,并且我想在按下左键或右键时旋转汽车。

我写了这段代码:

world = Matrix.CreateTranslation(position) * Matrix.CreateRotationY(angle) * Matrix.CreateFromAxisAngle(Vector3.UnitX, MathHelper.ToRadians(-90));

此代码不起作用,谁能告诉我如何移动它?

【问题讨论】:

  • 您能否比“此代码不起作用”更具体。到底出了什么问题?
  • 你真的对汽车的矩阵做了什么吗?
  • ChrisF :当我向上和向左按时,汽车向前行驶,但它围绕自身旋转。 ktodisco:汽车矩阵就是世界
  • 这个工作:world = Matrix.CreateTranslation(position) *Matrix.CreateFromAxisAngle(Vector3.UnitX, MathHelper.ToRadians(-90)); 它移动正确,但我仍然需要旋转汽车
  • 所以让我试着理解这一点 - 当您使用您在问题中发布的世界时,您的汽车会向前移动并转弯,但不会朝着您转弯的方向行驶?在这种情况下,您将不得不重新评估如何使汽车前进。我可以建议替换“位置+=新Vector3(-dirX,dirY,0);”使用“位置 += world.Forward * ”?另外,在世界矩阵中,我认为您需要先旋转汽车,然后再进行平移,否则它将围绕通用原点旋转。

标签: c# model 3d xna move


【解决方案1】:

您应该知道,您的 Y 轴实际上是“向上”,而不是“向前”(按照惯例)。虽然这个问题有很多解决方案,但最快的解决方法是:

float dirX = (float)Math.Sin(angle);
float dirZ = (float)Math.Cos(angle);

position += new Vector3(dirX, 0, dirZ); 

然后,你应该以正确的顺序乘以你的变换矩阵:

Scale * Rotation * Translation

在您的情况下翻译为:

// this will rotate car around the Y axis, and then translate it to correct location
world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(position);

一个建议,按照A-Type的建议做,使用方向*速度。

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多