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

物体于局部坐标系内构建,每个物体拥有自己的局部坐标系以及相应的顶点矩阵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. druid yml

    application-db.yml pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true p ...

  2. 吴裕雄--天生自然C语言开发:运算符

    #include <stdio.h> int main() { ; ; int c ; c = a + b; printf("Line 1 - c 的值是 %d\n", ...

  3. 为什么java的接口的方法是public abstract修饰?为什么属性是public static final 修饰?

     为什么java的接口的方法是public abstract修饰? 1.首先要明白接口的定义和作用是什么: 接口定义:接口是一个全部由抽象方法组成的集合,里面都是抽象方法和常量,用interface修 ...

  4. php启动后netstat看不到9000端口的问题

    https://www.cnblogs.com/jonsea/p/5522018.html     php-fpm配置文件详解 其实就是PHP配置文件改一个参数 listen = 127.0.0.1: ...

  5. 使用命令安装laravel 项目

    cp .env.example .env   拷贝.env 文件 php artisan key:generate  生成秘钥 php artisan migrate   生成数据表 composer ...

  6. android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码

    Android精选源码 一个可以上拉下滑的Ui效果,觉得好看可以学学 APP登陆页面适配 一款采用MVP的的完整漫画APP源码 android实现钉钉地图效果源码 一个使用单个文字生成壁纸图片的app ...

  7. 吴裕雄--天生自然python学习笔记:python设置文档的格式

    Win32com 组件可为特定范围的内 容设置格式, 较常用的格式有标题格式.对齐 方式格式及字体格式 . 许多格式使用 常量表示 , 所 以 需先导入 constants常量模块 : 设置标题格式的 ...

  8. Java 的 ArrayList 的底层数据结构

    1. 数据结构--ArrayList源码摘要 ublic class ArrayList<E> extends AbstractList<E> implements List& ...

  9. SpringBoot之HandlerInterceptor拦截器的使用 ——(三)获取requestBody解决java.io.IOException: Stream closed

    原文地址:https://blog.csdn.net/zhibo_lv/article/details/81875705 感谢原作者

  10. python中编码判断

    https://www.cnblogs.com/lc-D-a/p/6074878.html python3 用isinstance()检查unicode编码报错