最近在看龙书,写一下自己的学习理解,主要是物体运动的合成。

物体于局部坐标系内构建,每个物体拥有自己的局部坐标系以及相应的顶点矩阵A,并通过世界矩阵变换到唯一的世界坐标系。

物体在某时刻发生了位移和旋转,以小车运动举个例子,车在 dt 时间内沿着朝向 r 产生了位移 s ,并改变了朝向,旋转了 θ 度。

这里有两种方式合成物体的最终状态:

(1)先位移 r ,在终点位置上,旋转 θ 角度,故当前时刻渲染的图像 Ar = T * R,其中T是位移矩阵,R是在终点位置的绕轴旋转矩阵。

考虑时间上的累积,Ar = A * (T1*R1)*(T2*R2)*...*(Tk*Rk)*...*(Tn*Rn),其中 k = 1, 2, ..., n 表示每个时间片,Rk是在当前位置上的绕Y轴的旋转矩阵(转向嘛,我们认为极短的时间内上一时刻的转向后的方向就是下一时刻位移的方向)。

(2)先绕原点旋转 θ 角度,再位移到目标位置处,故当前时刻渲染的图像 Ar = R' * T,其中T是位移矩阵,R'是在局部坐标系内的旋转矩阵,也就是绕原点。

考虑时间上的累积,Ar = A * (R1*R2*...*Rk*...*Rn)*(T1*T2*...Tk*...*Tn),其中 k = 1, 2, ..., n 表示每个时间片,Rk是在原点绕Y轴的旋转矩阵。

* 解释一下为什么是绕原点旋转:

(1)A是在局部坐标系内构建的,一旦构建之后,位置关系就确定了(刚体),推入到GPU显存中的顶点坐标就确定了,在显存中自始至终都没有变过;

(2)在没有进行任何旋转和位移操作时,局部坐标系实际是和世界坐标系是重合的,此时的A在局部坐标系内的位置,其实也是在世界坐标系内的位置,A*W之后,物体发生了运动,也就是局部坐标系相对相对世界坐标系发生了运动(缩放、旋转、位移);

(3)物体的最终状态都可以认为是初始状态A经过一系列时间上的累积变化而形成的,物体最终的缩放、旋转、位移状态,都可以是在原点(也就是位移没有发生)发生缩放和旋转,再移动到相应的位置(产生位移)。这和先产生位移,在位移后的位置上再缩放和旋转是一样的。

由于DirectXMath库中提供的XMMatrixRotation系列函数所绕轴均为过原点的轴,但是(1)过程需要过当前位置处的轴,第一种方式在构建旋转矩阵并不容易。

第二种方式,令R = R1*R2*...*Rk*...*Rn,T = T1*T2*...Tk*...*Tn,W = R * T,则有 Ar = A * W,形式上更简单,实现也更简单。只需要计算当前时刻上要发生的旋转和位移,并将初始至当前时刻上的旋转、位移累积:R *= Rk,T *= Tk,就可以得到当前时刻的世界矩阵。

【DirectX 11学习笔记】世界矩阵的理解-运动合成的更多相关文章

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...

  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第八章:光照

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第八章:光照 代码工程地址: https://github.com/j ...

  4. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二) 代码工程地址: https:/ ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制 代码工程地址: https://gi ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图 本章介绍一种在游戏和应用中,模拟动态阴影的基本阴影 ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...

随机推荐

  1. play framework在eclipse中自动的预编译生成precompiled文件

    一.修改 eclipe 中的启动文件属性eclipse/*.launch 中的最后一条:加入参数 -Dprecompile=yes  将会在启动项目时,进行项目的预编译 (将在项目中生成 precom ...

  2. 使用mui框架开发App,当input获取焦点时,键盘弹出,底部导航栏上升。

    转自 https://blog.csdn.net/elementFei/article/details/72917393 感谢 问题: 使用mui框架开发App,当input获取焦点时,键盘弹出,底部 ...

  3. 关于 Cantor 集不可数的新观点

    第一步操作:将区间 $[0,1]$ 中去掉开区间 $(\frac{1}{3},\frac{2}{3})$ 后,就形成了两个不交闭区间.于是这两个不交闭区间中至少有两个元素,正好是集合 $\{1\}$ ...

  4. mysql命令运行sql文件

    navicat转储sql,cmd 打开运行 切换到mysql目录下:mysql -uroot -p  回车输入密码 创建数据库语句:  CREATE DATABASE `tcc` CHARACTER  ...

  5. OpenCVSharp介绍

    OpenCvSharp 是一个OpenCV的.Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考.该库采用LGPL发行,对商业 ...

  6. Android USB应用开发指南

    调试 USB接口被占用后使用wifi调试模式 详见:https://blog.csdn.net/u013758456/article/details/78911812 开发

  7. 推荐几款开源的js日期控件

    做为一个正规的网站,经常需要一些日期或时间的筛选,所以我们今天就推荐二十多款javascript的js日期/时间筛选插件.个个经典,绝对有你需要的. My97DatePicker ,国人开发的一款js ...

  8. 四、RabbitMQ Exchange类型

    RabbitMQ整体上是一个生产者与消费者模型,主要负责接收.存储和转发消息.可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ就好 ...

  9. Qt QImag图像保存、格式转换

    图像保存bool QImage::save(const QString &fileName, const char *format = Q_NULLPTR, int quality = -1) ...

  10. nodejs express 框架 上传文件

    web 项目应用express4.0框架 html 表单post 文件上传失败,后端无法获取提交文件 express不支持文件上传. 方式一 若是图片,可以将图片转码为BASE64上传 前端框架ang ...