这断时间工作比较忙,只有很少的时间写代码,但我还是抽尽可能的抽出了精力。
有个问题卡了很久,今天终于搞定了,那就是dx里面的四元素转欧拉角,dx里面并没有提供方法,需要要自己求解
我想要实现3dmax里面友好的人机交互,现在的效果,即可以输入参数或责也可以在场景里面随意拖动,绕轴旋转,平移,缩放
基本思路是D3DXMatrixDecompose把worldmatrix,解析成缩放分量,旋转四元数分量,和平移矩阵分量
再用四元素D3DXMatrixRotationQuaternion得到旋转矩阵,反求欧拉角着实花了点功夫:
//从directx的旋转矩阵rotationMatrix反解出欧拉角,这个方法来之不易啊
void Math::DecomposeRollPitchYawZXYMatrix(D3DXMATRIX *mx, OUT float *xPitch, OUT float *yYaw, OUT float *zRoll)
{
*xPitch = asinf(-mx->_32);
float threshold = 0.001f; float test = cosf(*xPitch);
if(test > threshold) {
*zRoll = atan2(mx->_12, mx->_22);
*yYaw = atan2(mx->_31, mx->_33);
}
else {
*zRoll = atan2(-mx->_21, mx->_11);
*yYaw = 0.0f;
}
}
用这些,实现了参数输入控制worldmatrix
另外,用鼠标拖动对象在空间transform也不那么简单,我构建了三垂面,用拾取三垂面的交点,鼠标移动前后的差来计算,旋转的角度,平移的距离,和缩放的比例,另外,三垂面本身随对象距离也会自动放大和缩小,仔细观察3dmax你会发现,无论对象拖到多远多近,辅助的三垂轴投影大小都不变,我也实现了这样的效果,拖放起来得心应手,基本上和3dmax的手感差不多了。呵呵。。。
截个图出来看看效果^_^