【转载】D3DXMatrixLookAtLH视图变换函数详解
视图坐标系和局部坐标系是一样的,都是世界坐标系转换为指定的局部坐标系,从局部点到世界点需要先缩放旋转后平移Mx*My*Mz*P的变换矩阵,而从世界点到局部点要进行先平移后旋转缩放的逆过程P-1Mz-1My-1Mx-1的变换矩矩阵(PMzMyMx是重用局部点到世界的变换).
矩阵是重新分解和组合空间位置和方位的空间变换过程;
矩阵行是新坐标系的基向量或表示平移,用变换后的向量在原坐标系各轴分解得的向量表示;
矩阵列是对应原坐标系的各轴,是各新基向量在列对应原坐标系的轴上的累积(组合)向量。
*/
D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);//camera在世界坐标系中的位置向量
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);//target是camera的朝向向量,可以是原点,也 可以是其它观察点
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);//定义向上的方向,一般是[0,1,0]
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &position, &target, &up);//V是world-to-view空间的变换矩阵,是view-to-world空间变换矩阵的逆矩阵
Device->SetTransform(D3DTS_VIEW, &V);//设置变换的状态,实际变换时,先得到变换矩阵,然后才将相机内的物体乘以变换矩阵。
原型:
D3DXMATRIX* D3DXMatrixLookAtLH(
_Inout_ D3DXMATRIX *pOut,
_In_ const D3DXVECTOR3 *pEye, // 视图坐标系中新的观察点的位置(可以解释为新的摄像机位置from)
_In_ const D3DXVECTOR3 *pAt, // 观察目标原来所在的世界坐标系的位置(变换时需要camera观察点平移旋转到该点),一般是(0,0,0)或者原来世界坐标系位置(观察目标位置)(可以解释为变换后的摄像机平移旋转到的位置to,世界物体根据新的观察坐标系进行参考定位)。
_In_ const D3DXVECTOR3 *pUp // 向上的方向,一般是(0,1,0)
);
返回的新坐标系是:
zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)
xaxis.x yaxis.x zaxis.x 0
xaxis.y yaxis.y zaxis.y 0
xaxis.z yaxis.z zaxis.z 0
-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1
// 注意到平移是各个方向上都求了逆,旋转是旋转物体的逆矩阵也就是实现坐标系变换,用新的坐标系描述所有物体。
参考:http://msdn.microsoft.com/zh-cn/library/windows/desktop/bb205342%28v=vs.85%29.aspx
【转载】D3DXMatrixLookAtLH视图变换函数详解的更多相关文章
- OpenGL的glTranslatef平移变换函数详解
OpenGL的glTranslatef平移变换函数详解 glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换. 我们先 ...
- OpenGL的glRotatef旋转变换函数详解
OpenGL的glRotatef旋转变换函数详解 先看一下函数定义:void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLflo ...
- ThinkPHP视图查询详解
ThinkPHP视图查询详解 参考http://www.jb51.net/article/51674.htm 这篇文章主要介绍了ThinkPHP视图查询,需要的朋友可以参考下 ThinkP ...
- 【转载】Java 集合详解
转载:https://www.cnblogs.com/ysocean/p/6555373.html 一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段 ...
- Django 框架篇(四) : 视图(view)详解 以及 路由系统(url)
|--Django的View(视图) |-- CBV和FBV: |-- 给视图增加装饰器: |-- request对象: |-- response对象: |-- Django的路由系统(url): | ...
- [转载]Java迭代器(iterator详解以及和for循环的区别)
Java迭代器(iterator详解以及和for循环的区别) 觉得有用的话,欢迎一起讨论相互学习~[Follow] 转载自 https://blog.csdn.net/Jae_Wang/article ...
- moviepy音视频剪辑:与大小相关的视频变换函数详解
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...
- 【转载】Java泛型详解
[转载]http://www.importnew.com/24029.html 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考 ...
- OpenGL的gluLookAt观察变换函数详解
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble center ...
随机推荐
- Sql_从查询的结果集中分组后取最后有效的数据成新的结果集小记(待优化)
Dim sql As String = " SELECT xp.*, " sql = sql + " xf_owner.ownername, " sql = s ...
- ASP.Net WebAPI的返回值
Asp.Net WebAPI服务函数的返回值主要可以分为void.普通对象.HttpResponseMessag.IHttpActionResult e四种,本文这里简单的介绍一下它们的区别. 一.返 ...
- spring mvc 解决跨域问题
Spring MVC 从4.2版本开始增加了对CORS的支持. 在Controller上使用@CrossOrigin注解: // 指定域名 @CrossOrigin("http://doma ...
- HTML-head头部浅析
HTML结构 在sublime或HBuildr新建HTML文件,输入html:5,按下tab键后,自动生成的代码大致如下: <!DOCTYPE html> <html lang=&q ...
- grafana的安装与设置(一)
zabbix3.4.9和grafana5.1.3的整合 官方文档:http://docs.grafana.org/installation/rpm/ 本次介绍两种安装方法,其他的方法请查看官方文档: ...
- Aria2 无限制下载神器
Aria2 是一款免费开源跨平台且不限速的多线程下载软件,Aria2的优点是速度快.体积小.资源占用少:支持 HTTP / FTP / BT / Magnet 磁力链接等类型的文件下载:支持 Win. ...
- was集群下基于接口分布式架构和开发经验谈
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/luozhonghua2014/article/details/34084935 某b项目是我首 ...
- Curator 基本API
package bjsxt.curator.base; import java.util.List; import java.util.concurrent.ExecutorService; impo ...
- Day2 CSS
什么是CSS 层叠样式表(cascading style sheet) 控制页面元素的显示方式.(添加样式) CSS语法 行间样式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出C ...
- 【node.js】readline (逐行读取)
官网链接:http://nodejs.cn/api/readline#readline_readline require('readline') 模块提供了一个接口,用于从可读流(如 process. ...