【发布时间】: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 * ”?另外,在世界矩阵中,我认为您需要先旋转汽车,然后再进行平移,否则它将围绕通用原点旋转。