D3D鼠标旋转物体算法(总结) - 范文中心

D3D鼠标旋转物体算法(总结)

12/13

首先我们需要定义一些变量来储存所需信息

D3DXQUATERNION g_qNow, g_qDown; //分别是 现在的旋转用四元数 按下鼠标时的旋转用四元数

D3DXVECTOR3 g_vDownPt, g_vCurrentPt; //分别是 按下鼠标时的球面上的位置向量 当前的位置向量

bool g_bDrag = false; //是否按下鼠标左键 用来判断按键拖拽

然后初始化这些变量

D3DXQuaternionIdentity(&g_qNow);

D3DXQuaternionIdentity(&g_qDown);

g_bDrag = false;

好了,初始化工作做完了,然后具体讲下算法。

在鼠标按下处理过程

case WM_LBUTTONDOWN:

{

int iMouseX = ( short )LOWORD( lParam );

int iMouseY = ( short )HIWORD( lParam );    //得到屏幕坐标

g_bDrag = true;

g_qDown = g_qNow;

g_vDownPt = ScreenToVector( ( float )iMouseX, ( float )iMouseY );   //得到投影窗口下的坐标

}

在鼠标移动处理过程

case WM_MOUSEMOVE:

{

if( g_bDrag )

{

int iMouseX = ( short )LOWORD( lParam );

int iMouseY = ( short )HIWORD( lParam );  //得到屏幕坐标

g_vCurrentPt = ScreenToVector( ( float )iMouseX, ( float )iMouseY );//得到投影窗口下的坐标

g_qNow = g_qDown * QuatFromBallPoints( g_vDownPt, g_vCurrentPt );

}

}

//看看QuatFromBallPoints函数

D3DXQUATERNION QuatFromBallPoints( const D3DXVECTOR3& vFrom, const D3DXVECTOR3& vTo )

{

D3DXVECTOR3 vPart;

float fDot = D3DXVec3Dot( &vFrom, &vTo ); //取得两向量的点乘,因为两个都是单位向量,所以fDot等于cos theta

D3DXVec3Cross( &vPart, &vFrom, &vTo );//叉乘,获得的是垂直于两个向量的一个向量,即旋转轴。其模等于|a||b|sin theta等于sin theta

return D3DXQUATERNION( vPart.x, vPart.y, vPart.z, fDot );//正好构成一个旋转2*theta角度的四元数

}

首先说一下旋转四元数,一个(x*sin theta, y*sin theta, z*sin theta, cos theta)的四元数被用来旋转2*theta角度。在上面的代码中通过两个单位向量得到了一个旋转四元数。从效果上来说就是鼠标在球体上做过theta角度,物体就旋转2*theta角度。这是一个很方便的解决方法,不仅省却了换算,也使得物体能够在一次拖拽中旋转360度。现在大部分事情都清楚了,接下来只要在绘制之前把世界矩阵按所得的旋转四元数旋转之后绘制物体就可以了。

我们使用D3DXMatrixRotationQuaternion这个函数从四元数得到一个旋转矩阵作为世界矩阵。

D3DXMATRIXA16 matWorld;

D3DXMatrixRotationQuaternion( &matWorld, &g_qNow );

g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

至此完成,我们只需要在每一次绘制的时候按当前的旋转四元数即g_qNow来设置世界矩阵即可。


相关内容

  • 测量运动物体姿态的三自由度定位算法的研究
    自动化测试 计算机测量与控制. 2002. 10(6) Computer Measurement &Control ・363・ 文章编号:1671-4598(2002) 06-0363-03 中图分类号:TM93 文献标识码:A 测 ...
  • 北师大版小学数学三年级下册教材教学内容和教学目标
    新世纪(版)<义务教育课程标准实验教科书数学>(三年级下册)是小学数学第一学段的最后一册教材.学习本册教材要初步理解小数和分数的意义,感知平移.旋转和对称等图形的变换,理解乘法与面积的联系,体验统计平均数的必要性,以及能够列出简 ...
  • 俄罗斯方块
    程序设计实践设计报告 课题名称: 学生姓名: 班 学 日 级: 号: 期: 班内序号: 双人俄罗斯方块游戏程序 陈宸 2013211113 12 2 0 1 3 21 0 3 75 2015.6.13 1.课题概述 1.1 课题目标和主要内 ...
  • 太阳能分析
    太阳能分析- 内部日光照射 显示阴影 这是一个简短的教程,解释模型显示在一特定对象阴影(和反射)的过程.在这种情况下它是用来说明太阳内部空间的渗透作用. 1 从开阳Penetration.eco教程文件在您的主ECOTECT安装目录所在的目 ...
  • 使用卷积网络估计三维形状的正朝向
    中圈料孽艘求大誊使用卷积网络估计三维形状的正朝向作者姓名:刘子舜学科专业:计算数学导师姓名:文lJ禾lJ网IJ教授完成时间:二.一六年五月硕士学位论文 UniversityofScienceandTechnologyofChinaAdiss ...
  • 遗传算法编码方案比较
    第28卷第3期2011年3月 计算机应用研究ApplicationResearchofComputers Vo.l28No.3 Mar.2011 遗传算法编码方案比较 张超群,郑建国,钱 洁 1,2 1 1 * (1.东华大学旭日工商管理学 ...
  • 体积和容积的计算
    体积和容积的计算 教学内容:北师大版小学数学第12册第75-77页内容. 教学目标: 1.进一步理解立体图形体积和容积的意义,能区分二者的异同:复习和掌握立体图形的计算公式. 2.能熟练的计算立体图形的体积和容积,理解这些体积公式的推导过程 ...
  • 百日冲刺书上涉及的选择题(包括例题)
    百日冲刺书上涉及的选择题(包括例题) 一.必修部分 1.以下( )项所述不是信息. A. 通知:今天下午高一和高二举行篮球赛 B. 全班的期中考试成绩 C. 2006年12月23日的<新华日报> D. 教育部公布"20 ...
  • 资源管理器教案
    资源管理器" 教学设计 " 资源管理器" 教学设计 江苏省泰兴中学 戴冬梅[设计思路]: 结合多媒体课件的演示,给学生一个直观的印象,帮助学生掌握对资源管理器功能的应用,并在讲课的过程中让学生参与实践操作,从而 ...
  • 多媒体虚拟现实技术的发展与应用
    多媒体虚拟现实技术的发展与应用 [摘 要]虚拟现实技术是在以Internet为特征的信息革命中的又一个飞跃,它的沉浸感.交互性.和刺激性为未来媒体的发展确定了方向.虚拟现实技术与美术.音乐等文化艺术结合交融,应用领域越来越广泛,将给人们的工 ...