如何让物体(mesh)绕指定轴旋转

gz_wuling 2010-04-17 04:42:13
本人想让某个物体根据前进的方向以一定的仰角水平移动,于是计算出这一轴向,然后计算选择矩阵,然后乘入坐标中,如下:
D3DXVECTOR3 依据水平方向获得的旋转轴= 。。。。。;//计算出的向量
D3DXMATRIX matRotationA; //旋转矩阵
float 上下旋转角=3.14/4 ;//指定角度
D3DXMatrixRotationAxis(&matRotationA,&依据水平方向获得的旋转轴,上下旋转角); //计算矩阵
D3DXMatrixMultiply (&m_mWorld,&matRotationA,&m_mWorld);//乘入坐标中

结果发现“依据水平方向获得的旋转轴”只与mesh 的原始坐标有关,例如(1,0,0),也就是说,如果想达到前述目标,只需把“依据水平方向获得的旋转轴”设定为(1,0,0),而不必计算。无论mesh 实际方向如何,这一“依据水平方向获得的旋转轴”总需要设为(1,0,0)。这似乎和乘的顺序有关,但如果改变顺序,如下:
D3DXMatrixMultiply (&m_mWorld,&m_mWorld,&matRotationA);//乘入坐标中
则mesh 不再是按水平运动,而是按这个角度移动。
怎么办?请高手指教!
...全文
448 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxdfigo 2010-04-17
  • 打赏
  • 举报
回复
用四元数
张赐 2010-04-17
  • 打赏
  • 举报
回复
楼主的计算顺序应该这样

1.将物体移回到原点

2.旋转物体

3.将物体移动到原来的地方

示例程序目录及简要说明 第2章 Direct3D程序设计基础 CreateDevice 演示Direct3D程序的基本框架,以及如何创建Direct3D对象和Direct3D设备对象。 第3章 坐标系与基本图元 1、VertexBuffer 演示使用顶点缓冲区对象绘制基本图元。 2、BasicPrimitive 演示Direct3D中6种基本图元的绘制。通过单击键盘上的“1”~“6”数字键可以在各图元类型之间进行切换。 3、IndexBuffer 演示使用顶点缓冲区和索引缓冲区绘制基本图元。 4、RenderState 演示顶点着色模式和图形填充方式两个基本渲染状态对图形显示的影响。通过单击鼠标左键在两个着色模式之间进行切换,单击鼠标右键在3种图形填充模式之间进行切换。 5、AntiAlisa 演示通过多重采样实现图形反锯齿效果。程序运行时通过单击鼠标左键可以在启用和禁用图形反锯齿效果之间进行切换。 6、FullScreen 演示全屏幕显示模式Direct3D程序的开发,主要是创建全屏显示模式的Direct3D设备。因为程序运行在全屏模式下,所以不能像运行在窗口模式下那样,通过单击标题栏上的“关闭”按钮来关闭程序,可以通过单击键盘上的“Esc”键退出程序,也可以通过按下“Alt+F4”键退出程序。 第4章 顶点坐标变换 Transfrom 演示三维坐标变换、视区变换,以及简单动画的实现。 第5章 光照与材质 1、SimpleLighting 演示灯光的使用。 2、Multilights 演示同时使用多个光源的效果。一共使用三个光源,分别是漫反射方向光光源、漫反射点光源、镜面反射方向光光源。默认情况下,3个光源全部关闭,按下数字键“1”,启用1号光源;按下数字键“2”,启用2号光源;按下数字键“3”,启用3号光源;按下数字键“4”,3个光源全部启用;按下数字键“0”,3个光源全部关闭。 第6章 纹理映射基础 1、TextureBase 演示使用纹理贴图的基本步骤。 2、TexFilterMode 演示最近点采样和线性纹理过滤方式。在程序运行时,单击键盘上的数字键“1”,使用最近点采样纹理过滤方式,单击键盘上的数字键“2”,则使用线性纹理过滤。 3、MipTexture 演示如何创建和使用多级渐进纹理。程序运行时,单击键盘上的数字键“1”,则使用多级渐进纹理,单击数字键“2”,则使用单级别纹理。通过按下“↓”键和“↑”键可以放大和缩小显示的图形,从而可以仔细观察图像的变化,看到多级渐进纹理的效果。 4、TexAddressMode 演示不同纹理寻址模式的效果。程序运行时,单击键盘上的数字键“1”,使用重叠纹理寻址模式,单击键盘上的数字键“2”,使用镜像纹理寻址模式,单击键盘上的数字键“3”,使用夹取纹理寻址模式,单击键盘上的数字键“4” ,使用边框颜色纹理寻址模式。 5、TexRenderState 演示纹理阶段混合状态的使用。 第7章 使用文件模型 1、Mesh 演示.X文件模型的使用,包括从.X文件中加载模型生成网格模型对象,渲染网格模型。 2、StateControlUseMatrix 演示使用矩阵旋转网格模型。程序运行时按下“D”和“A”键可以使飞机模型自身z旋转;按下“S”和“W”键可以使飞机模型x旋转;按下“Q”和“E”键可以使飞机模型自身y旋转;按下“F”和“V”键可以使飞机模型向前和向后运动。 3、StateControlUseQua 演示使用四元数旋转网格模型。程序运行时按下“D”和“A”键可以使飞机模型自身z旋转;按下“S”和“W”键可以使飞机模型x旋转;按下“Q”和“E”键可以使飞机模型自身y旋转;按下“F”和“V”键可以使飞机模型向前和向后运动。 第8章 深度测试与Alpha混合 1、ZTest 演示深度测试的使用。程序运行时按下数字键“1”启用深度测试,按下数字键“0”,则禁用深度测试。 2、AlphaBlend 演示使用Alpha混合实现半透明效果。程序运行时按下数字键“1”,启用Alpha混合,按下数字键“0”,则禁用Alpha混合。 3、VertexAlpha 演示直接为顶点颜色设置Alpha值。程序运行时按下数字键“1”,启用Alpha混合,按下数字键“0”,则禁用Alpha混合。 4、TextureAlpha、 演示通过纹理混合获取Alpha 值。程序运行时按下数字键“1”,启用Alpha混合,按下数字键“0”,则禁用Alpha混合。 5、AlphaTest 演示Alpha测试的使用。程序运行时按下数字键“1”,启用Alpha测试,按下数字键“0”,则禁用Alpha测试。 第9章 雾化 1、VertexFog 演示顶点雾化效果。程序运行时按下数字键“1”,
目录: 第Ⅰ部分 基础知识 必备的数学知识 3D空间中的向量 向量相等 计算向量的长度 向量的规范化 向量加法 向量减法 数乘 点积 叉积 矩阵 矩阵相等、矩阵数乘和矩阵加法 矩阵乘法 单位矩阵 逆矩阵 矩阵的转置 D3DX矩阵 基本变换 平移矩阵 旋转矩阵 比例变换矩阵 几何变换的组合 向量变换的一些函数 平面(选读) D3DXPLANE 点和平面的空间关系 平面的创建 平面的规范化 平面的变换 平面中到某一点的最近点 射线(选读) 射线 射线与平面的相交 小结    第Ⅱ部分 Direct3D基础 第1章 初始化Direct3D 1.1 Direct3D概述 1.1.1 REF设备 1.1.2 D3DDEVTYPE 1.2 COM(组件对象模型) 1.3 预备知识 1.3.1 表面 1.3.2 多重采样 1.3.3 像素格式 1.3.4 内存池 1.3.5 交换链和页面置换 1.3.6 深度缓存 1.3.7 顶点运算 1.3.8 设备性能 1.4 Direct3D的初始化 1.4.1 获取接口IDirect3D9的指针 1.4.2 校验硬件顶点运算 1.4.3 填充D3DPRESENT_PARAMETER结构 1.4.4 创建IDirect3DDevice9 接口 1.5 例程:Direct3D的初始化 1.5.1 d3dUtility.h/cpp 1.5.2 例程框架 1.5.3 例程:D3D初始化 1.6 小结 第2章 绘制流水线 2.1 模型表示 2.1.1 顶点格式 2.1.2 三角形单元 2.1.3 索引 2.2 虚拟摄像机 2.3 绘制流水线 2.3.1 局部坐标系 2.3.2 世界坐标系 2.3.3 观察坐标系 2.3.4 背面消隐 2.3.5 光照 2.3.6 裁剪 2.3.7 投影 2.3.8 视口变换 2.3.9 光栅化 2.4 小结 第3章 Direct3D中的绘制 3.1 顶点缓存与索引缓存 3.1.1 创建顶点缓存和索引缓存 3.1.2 访问缓存内容 3.1.3 获取顶点缓存和索引缓存的信息 3.2 绘制状态 3.3 绘制的准备工作 3.4 使用顶点缓存和索引缓存进行绘制 3.4.1 IDirect3DDevice9::DrawPrimitive 3.4.2 IDirect3DDevice9::DrawIndexedPrimitive 3.4.3 Begin/End Scene 3.5 D3DX几何体 3.6 例程:三角形、立方体、茶壶、D3DXCreate* 3.7 小结 第4章 颜色 4.1 颜色表示 4.2 顶点颜色 4.3 着色 4.4 例程:具有颜色的三角形 4.5 小结 第5章 光照 5.1 光照的组成 5.2 材质 5.3 顶点法线 5.4 光源 5.5 例程:光照 5.6 一些附加例程 5.7 小结 第6章 纹理映射 6.1 纹理坐标 6.2 创建并启用纹理 6.3 纹理过滤器 6.4 多级渐进纹理 6.4.1 多级渐进纹理过滤器 6.4.2 使用多级渐进纹理 6.5 寻址模式 6.6 例程:纹理四边形 6.7 小结 第7章 融合技术 7.1 融合方程 7.2 融合因子 7.3 透明度 7.3.1 Alpha通道 7.3.2 指定Alpha来源 7.4 用DirectX Texture Tool 创建Alpha通道 7.5 例程:透明效果 7.6 小结 第8章 模板 8.1 模板缓存的使用 8.1.1 模板缓存格式的查询 8.1.2 模板测试 8.1.3 模板测试的控制 8.1.4 模板缓存的更新 8.1.5 模板写掩码 8.2 例程:镜面效果 8.2.1 成像中的数学问题 8.2.2 镜面效果实现概述 8.2.3 代码解析 8.3 例程:Planer Shadows 8.3.1 平行光阴影 8.3.2 点光源产生的阴影 8.3.3 阴影矩阵 8.3.4 使用模板缓存防止二次融合 8.3.5 代码解析 8.4 小结 第Ⅲ部分 Direct3D的应用 第9章 字体 9.1 ID3DXFont接口 9.1.1 创建一个ID3DXFont 接口对象 9.1.2 绘制文本 9.1.3 计算每秒绘制的帧数 9.2 CD3DFont 9.2.1 创建CD3DFont类的实例 9.2.2 绘制文本 9.2.3 清理 9.3 D3DXCreateText函数 9.4 小结 第10章 网格(一) 10.1 几何信息 10.2 子集和属性缓存 10.3 绘制 10.4 网格优化 10.5 属性表 10.6 邻接信息 10.7 克隆 10.8 创建网格(D3DXCreateMeshFVF) 10.9 例程:网格的创建与绘制 10.10 小结 第11章 网格(二) 11.1 ID3DXBuffer 11.2 XFile 11.2.1 加载XFile文件 11.2.2 XFile材质 11.2.3 例程:XFile 11.2.4 生成顶点法线 11.3 渐进网格 11.3.1 生成渐进网格 11.3.2 顶点属性权值 11.3.3 ID3DXPMesh接口方法 11.3.4 例程:Progressive Mesh 11.4 外接体 11.4.1 一些新的特殊常量 11.4.2 外接体的类型 11.4.3 例程:Bounding Volumes 11.5 小结 第12章 设计一个灵活的Camera类 12.1 Camera类的设计 12.2 实现细节 12.2.1 观察矩阵(取景变换矩阵, View Matrix)的计算 12.2.2 任意旋转 12.2.3 俯仰、偏航和滚动 12.2.4 行走、扫视和升降 12.3 例程:Camera 12.4 小结 第13章 地形绘制基础 13.1 高度图 13.1.1 创建高度图 13.1.2 加载RAW文件 13.1.3 访问和修改高度图 13.2 创建地形几何信息 13.2.1 顶点的计算 13.2.2 索引的计算 13.3 纹理映射 13.4 光照 13.4.1 概述 13.4.2 坐标方格的明暗度计算 13.4.3 对地形进行着色 13.5 在地形中“行走” 13.6 例程:Terrain 13.7 一些改进 13.8 小结 第14章 粒子系统 14.1 粒子和点精灵 14.1.1 结构格式 14.1.2 点精灵的绘制状态 14.1.3 粒子及其属性 14.2 粒子系统的组成 14.2.1 绘制一个粒子系统 14.2.2 随机性 14.3 具体的粒子系统 14.3.1 例程:Snow System 14.3.2 例程:Firework 14.3.3 例程:Particle Gun 14.4 小结 第15章 拾取 15.1 屏幕到投影窗口的变换 15.2 拾取射线的计算 15.3 对射线进行变换 15.4 射线/物体相交判定 15.5 例程:Picking 15.6 小结

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧