如何围绕其中心旋转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;
我有一些建议让你开始:
- 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
结束你的语句。