3d Game Walkman

3d图形渲染,网络引擎 — tonykee's Blog
随笔 - 45, 文章 - 0, 评论 - 309, 引用 - 0
数据加载中……

这断时间比较忙,但闲暇的时候依然奋战,地图编辑器有了进展,今天终于完成了场景对象的拖放

这断时间工作比较忙,只有很少的时间写代码,但我还是抽尽可能的抽出了精力。
有个问题卡了很久,今天终于搞定了,那就是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的手感差不多了。呵呵。。。

截个图出来看看效果^_^









posted on 2008-04-16 21:59 李侃 阅读(2906) 评论(2)  编辑 收藏 引用 所属分类: 室外场景编辑器

评论

# re: 这断时间比较忙,但闲暇的时候依然奋战,地图编辑器有了进展,今天终于完成了场景对象的拖放  回复  更多评论   

厉害厉害
2008-04-17 11:42 | 七星重剑

# re: 这断时间比较忙,但闲暇的时候依然奋战,地图编辑器有了进展,今天终于完成了场景对象的拖放  回复  更多评论   

谢谢了·学习了·
2010-11-19 14:29 | 零水自流

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理