`
wjlgryx
  • 浏览: 307220 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

o3d 基本的矩阵操作

阅读更多

里记录一下矩阵的基本操作和矩阵乘法的顺序问题。
   1: while( msg.message!=WM_QUIT )
   2: {
   3:     // check for messages
   4:     if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
   5:     {
   6:         TranslateMessage( &msg );
   7:         DispatchMessage( &msg );
   8:     }
   9:     // this is called when no messages are pending
  10:     else
  11:     {
  12:         // Clear the backbuffer to a black color
  13:         pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, 0 );
  14: 
  15:         pd3dDevice->BeginScene();
  16: 
  17:         pd3dDevice->SetStreamSource( 0, vertexBuffer, 0, sizeof(CUSTOMVERTEX) );
  18:         pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  19: 
  20:         // translate the object away from the origin
  21:         D3DXMatrixTranslation(&matTranslate, 64.0f, 0.0f, 0.0f);
  22: 
  23:         // set the rotation
  24:         D3DXMatrixRotationY(&matRotate, timeGetTime()/1000.0f);
  25:        
  26:         // multiple the translation and rotation matrices to create the objMat matrix
  27:         D3DXMatrixMultiply(&objMat, &matRotate, &matTranslate);
  28:         D3DXMatrixMultiply(&objMat, &matTranslate, &matRotate);
  29: 
  30:         // transform the object in world space
  31:         pd3dDevice->SetTransform(D3DTS_WORLD, &objMat);
  32: 
  33:         pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,  0, 2 );
  34:         pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,  4, 2 );
  35:         pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,  8, 2 );
  36:         pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 12, 2 );
  37:         pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 16, 2 );
  38:         pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 20, 2 );
  39: 
  40:         pd3dDevice->EndScene();
  41: 
  42:         // Present the backbuffer contents to the display
  43:         pd3dDevice->Present( NULL, NULL, NULL, NULL );
  44:     }
  45: }
第21行和第23行的顺序其实是没有关系的。关键是第27行和第28行的区别。这里先插一句timeGetTime函数的用法。MSND上是这样说的:
The timeGetTime function retrieves the system time, in milliseconds. The system time is the time elapsed since Windows was started.
DWORD timeGetTime(VOID);
The only difference between this function and the timeGetSystemTime function is that timeGetSystemTime uses the MMTIME structure to return the system time. The timeGetTime function has less overhead than timeGetSystemTime.
所以timeGetTime得到的是一个递增的毫秒值。
第27行:matRotate * matTranslate,表示先平移后旋转(顺序与表达式刚好相反),效果就是绕着一根轴旋转,而该轴是Y轴向右(X轴正方向)平移6个单位。
第28行: matTranslate * matRotate,表示先旋转和平移。效果就是绕着Y轴旋转,旋转半径是64。可以在脑海中想一下,是这样叠加而成的:先在源点转一个角度,此时X轴也跟着旋转了,然后再向X轴平移64个单位。
怎样理解这种变换:前一个矩阵变换会影响后一个矩阵变换。据我所知,世界坐标是一个客观存在,那么可以推测以上的矩阵变换中的坐标都是围绕着物体模型本身的坐标。
比如第27行,物体先向X轴平移64个单位,此时物体模型的坐标系也向X轴平移了64个单位,然后再绕Y轴旋转,此时的Y轴不是世界坐标中的Y轴,而是物体模型坐标中经过平移之后的Y轴。这是可以解释的。
同样第28行,物体先绕着物体模型坐标系的Y轴旋转一个角度(此时,物体模型坐标系和世界坐标系是重合的),这时物体模型坐标系像前面一样,也旋转了同样的角度。此时物体模型坐标系的X轴与世界坐标系的X轴已经不再重合,此时再平移,是沿着物体坐标系的X轴向“右”平移64个单位。这也解释得通。
以上的推测,就是基于一点,世界坐标是客观存在的,它不会为其中一个物体的变换而变换。
分享到:
评论

相关推荐

    O3D 物体 编辑器

    "O3D 物体编辑器"是基于O3D库开发的一个工具,用于帮助用户在网页环境中设计、编辑和操作3D物体。这个编辑器实现了在Firefox浏览器中的拖动和旋转功能,为3D交互提供了便利。 1. **O3D库**:O3D是由Google开发的...

    O3D学习笔记[一]素材准备*.3ds转成*.o3dtgz

    在本篇O3D学习笔记中,我们将探讨如何将3DS格式的三维模型转换为O3DTGZ格式,这是O3D系统所使用的专有格式。3DS是一种广泛使用的三维建模软件3ds Max导出的文件格式,而O3DTGZ是O3D(Open 3D Engine)框架下的压缩...

    O3D 实例 研究中

    `o3djs` 包含了 O3D 的辅助库,提供了许多实用的工具函数和类,如加载管理器、动画系统、矩阵和向量操作等,它们简化了 O3D 开发过程,帮助开发者更高效地构建应用。 总的来说,这个 O3D 实例是一个典型的入门项目...

    谷歌O3D的javascript源码

    O3D库使用这些数学概念来表示位置、旋转和缩放,以及进行投影和平移等操作。开发者需要熟悉线性代数和几何学的基本知识。 5. **场景图**:O3D使用场景图来组织3D对象。场景图是一种层次结构,其中每个节点代表一个...

    O3D文档说明(主要关键字的说明及翻译)

    在O3D文档中,我们关注的是3D图形渲染的关键概念和术语,这些内容对于理解O3D框架的架构和工作原理至关重要。以下是对这些关键术语的详细解释: 1. **Draw Context 绘制上下文**:绘制上下文是3D渲染的核心组件,它...

    google o3d例子3

    o3d是Google开发的基于web的3d编程API,因文件太大分三次上传

    google o3d 编程例子1

    google开发的web3d编程APT o3d.提供的各种3d效果例子,因文件太大,分三个包传上

    3D-o3d.zip

    首先,建模阶段,通过拉伸、旋转和切割等操作,将基本几何体塑造成所需的形状。接着,进行纹理贴图,赋予模型颜色、材质和细节,使其看起来更加真实。最后,通过添加骨骼和关键帧来制作动画,让3D模型具有动态表现。...

    o3d lib1 graph javascript ajax

    o3d lib1 graph javascript ajax

    o3d goolge javascript

    o3d goolge javascript texture graph

    google o3d 编程例子2

    o3d是Google开发的基于web的3d编程API,因文件太大分三次上传

    野村综研O3W架构资料(内部)

    ### 野村综研O3W架构资料:深入解析与技术要点 #### 一、背景与挑战 在1980年代至1990年代初,日本许多企业开始进行核心业务系统的信息化改造,主要采用大型机为核心的专用系统。当时的终端设备主要是哑终端,仅能...

    o3dv_0.8.3.zip

    2. **o3dv.min.js**:这是 Online3DViewer 自己的JavaScript代码,经过压缩优化,用于在网页中嵌入和操作三维视图。它可能包含了对Three.js的扩展和定制,以适应特定的3D查看需求,比如用户交互、视图控制、模型加载...

    CaO-Al2O3和CaO-SiO2-Al2O3渣系中组元活度的计算 (2013年)

    根据分子和离子共存理论,建立了CaO-Al2O3 和CaO-SiO2-Al2O3 渣系的活度计算模型,并利用模型对渣中各组元的活度进行了计算,分析了 w (CaO )对渣中组元活度的影响.结果表明,在 CaO-Al2O3 渣系中,当w(CaO)小于45%时,...

    稀土氧化物掺杂SrO-CaO-Al2O3-SiO2-B2O3系统封接玻璃的研究

    稀土氧化物掺杂SrO-CaO-Al2O3-SiO2-B2O3系统封接玻璃的研究,沈阳,李橙,本论文通过淬火的工艺制备了分别掺杂稀土氧化物CeO2和Pr2O3的SrO-CaO-Al2O3-SiO2-B2O3系统封接玻璃。通过差热分析确定两组玻璃的特征温度,...

    纳米Al2O3/Cu复合材料的制备及其摩擦学特性

    首先采用化学镀铜工艺制备了Cu包覆纳米Al2O3复合粉体,分析了预处理工艺和化学镀工艺对复合粉体的组成及形貌的影响;再将均匀包覆的复合粉体与铜粉充分混合后,利用热压烧结成型工艺制备了纳米Al2O3弥散强化铜基复合...

Global site tag (gtag.js) - Google Analytics