【发布时间】:2016-02-14 15:39:54
【问题描述】:
我在使用矩阵方面有困难
我可以像这样移动对象、旋转和在单词坐标中移动:
matScale* matRotate * matTranslate
但我不知道如何在他的局部轴上移动一个对象 即:旋转后,移动(0,0,10) i 对象的局部Z
编辑: 对不起,我迷路了:(
我试过这个:
D3DXMatrixRotationX(&matRotateX, modell->getPitch());
D3DXMatrixRotationY(&matRotateY, modell->getYaw());
D3DXMatrixRotationZ(&matRotateZ, modell->getRoll());
matRotate = matRotateX * matRotateY * matRotateZ;
D3DXMatrixScaling(&matScale, modell->getScale().x, modell->getScale().y, modell->getScale().z);
Matrix WVP;
WVP = matScale* matTranslate * matRotate * matView * matProjection;
Matrix translation;
D3DXMatrixTranslation(&translation, 10, 10, 0); // just for test
cBuffer.Final = translation * WVP;
...但是旋转是围绕 WORLD 轴,而不是本地:(
编辑 2:
好的,我开始明白了……我们现在可以:
-在本地轴上翻译我的对象:
translation * matRotate * matScale * matTranslate * matView * matProjection
“或”我们可以:
-在局部轴上旋转这个对象:
matRotate * 平移 * matScale * matTranslate * matView * matProjection
但是,我想同时进行这两个转换^^,我想在<local> 中进行翻译,并且我想在<local> 中使用相同的操作进行旋转
这怎么可能? :-)
编辑 3
好的,我想我们可以简化一下...
我想在物体的 Z 轴上移动,我可以这样做:
if (input.keyPressed(VK_UP))
{
ship->translate(0, 0, -0.01, ASF3D::LOCAL);
}
然后,我更新我的对象在他们的类中的位置:(函数:翻译)
position.x += z * sin(yaw);
position.y += z * sin(pitch);
position.z += z * -cos(yaw);
在此之后,我制作了 matPosition(而不是管理位置矩阵和矩阵平移)
然后,我做我的:cBuffer.Final = matScale* matRotate * matTranslate* matView * matProjection;
我无法测试 atm,但我确信它可以正常工作并且更容易
我只是不确定三角函数的计算:P
【问题讨论】:
-
请添加一些代码。
-
显示您到目前为止尝试过的内容以及无法正常工作的内容
-
您在某处缺少
cos(pitch),我认为在 x 和 z 中(为了保持向量的长度),但除此之外,这应该是一个可行的解决方案。