如何围绕其中心旋转3D模型

本文关键字:旋转 3D 模型 何围绕 | 更新日期: 2023-09-27 18:04:03

我正在制作一款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;

如何围绕其中心旋转3D模型

我有一些建议让你开始:

  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;

为了防止我犯错误,我采用了一个命名约定:每个矩阵(或变换)被称为AtoB: WorldToView, ModelToWorld,或ModelToRotatedModel

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

  var modelToView = modelToWorld * worldToView; 

而不是:

  var nowhereToNowhere = worldToView * modelToWorld; 

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

注:我希望你的车模的原点在车的中心,否则它还是会奇怪地四处移动。

试着改变这些值:

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

变成:

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

我遵循一个简单的缩写ISROT

身份

规模

旋转面向

翻译

你从右向左工作,所以你总是以Translation结束你的语句。