【问题标题】:How to rotate a 3D model around its center?如何围绕其中心旋转 3D 模型?
【发布时间】:2011-08-01 03:16:12
【问题描述】:

我正在制作一个 3D 汽车游戏,但我遇到了旋转问题。 我想围绕自己旋转模型,但是当我移动时,它开始四处移动 世界 !

问题是:如何让模型移动的中心?

我尝试像这样更改代码:

 effect.World = Matrix.CreateRotationZ(modelRotation) *  effect.World = Matrix.CreateTranslation(position); 

现在不是相对于模型向前移动,而是沿设定的方向移动! & 这是我的代码:

 effect.World = Matrix.CreateTranslation(position) * Matrix.CreateRotationZ(modelRotation); 
                effect.View = camera.View; 
                effect.Projection = camera.Projection;

【问题讨论】:

  • 我建议您坚持每条语句使用一个赋值运算符。否则,结果可能会令人困惑、令人惊讶且难以阅读。
  • 执行此操作时发生了什么: effect.World = Matrix.CreateRotationZ(modelRotation) * effect.World = Matrix.CreateTranslation(position);我很困惑,你说它“朝着一个既定的方向移动”,你的意思是什么?

标签: c# 3d xna


【解决方案1】:

我有一些提示可以帮助您入门:

  1. DirectX/Xna 中的矩阵乘法顺序与您在学校学到的不同。

在学校v = A B y 的意思是:v = A (B y)。因此,在链接矩阵时,首先应用 B。

如果你想组合矩阵 A 和 B,你可以像 C = A B 一样将它们相乘

在 Directx/XNA 中,顺序是相反的。要组合矩阵 B 和 A,请编写 var C = B * A;

为了防止我犯错误,我采用了一个命名约定:每个矩阵(或变换)都称为AtoBWorldToViewModelToWorldModelToRotatedModel

这提醒你,第一个矩阵的输出必须与右矩阵的输入相匹配:

  var modelToView = modelToWorld * worldToView; 

而不是:

  var nowhereToNowhere = worldToView * modelToWorld; 

这对我帮助很大,我希望它可以帮助你解决你的矩阵问题。

附: 我希望你的汽车模型的原点在汽车的中心,否则它仍然会奇怪地移动。

【讨论】:

  • 如何获得汽车的原产地?
  • @zionpi 最简单的就是计算汽车的边界框,然后取这个框的中心。
【解决方案2】:

尝试切换这些值:

effect.World = Matrix.CreateTranslation(position) * Matrix.CreateRotationZ(modelRotation);

这样就变成了:

effect.World = Matrix.CreateRotationZ(modelRotation) * Matrix.CreateTranslation(position);

我遵循一个简单的首字母缩写词,称为 ISROT

身份

规模

旋转

方向

翻译

你从右到左工作,所以你总是以Translation结束你的陈述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多