我正在制作一款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;
答案 0 :(得分:3)
我有一些提示可以帮助您入门:
在学校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
。< / p>
这提醒您第一个矩阵的输出必须与右矩阵的输入匹配:
var modelToView = modelToWorld * worldToView;
而不是:
var nowhereToNowhere = worldToView * modelToWorld;
这对我帮助很大,我希望它可以帮助你解决矩阵问题。
P.S。 我希望你的汽车模型的起源位于汽车的中心,否则它仍会奇怪地移动。
答案 1 :(得分:3)
尝试切换这些值:
effect.World = Matrix.CreateTranslation(position) * Matrix.CreateRotationZ(modelRotation);
所以它变成了:
effect.World = Matrix.CreateRotationZ(modelRotation) * Matrix.CreateTranslation(position);
我遵循一个名为ISROT
身份
比例
轮换
方向
翻译
你从右到左工作,所以你总是用Translation
结束你的陈述。