【转载】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 ...
随机推荐
- 微信网页IOS上传图片旋转解决方案
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- EntityFramework Core2.0 多对多关系配置
在EF6.0 中,多对多关系配置时,系统会自动生成第三张表,来将两张有互相约束关系的表联系起来,但是在EF Core2.0中,我们需要手动建立第三张表,比如说有两个模型Passage.cs和Cat ...
- <Lord don’t move that mountain>
<Lord don’t move that mountain> Lord, don't move that mountain(主,不要移走高山) Give me strength to c ...
- 用eval似乎会执行结果一次性返回,结果显示的是一行
with open(r'商品资料','r',encoding='utf-8') as f1: lis_goods = eval(f1.read()) # 用eval似乎会执行结果一次性返回,结果显示的 ...
- 我遇到的问题:耗时久/效率低 ---> 应对方案: 行动-结果指向
这一篇打的时候,时间都挺靠后的了, 当时出现错误,很慌了,一个是时间比较久,5点多了,一个是陈果已经做了很多题了,这些是事实. 导致我慌张的原因,简单来说是比较,长久以来,我都爱去和别人比较.如果赢了 ...
- python -wordcloudan云词安装
1安装网站:https://download.lfd.uci.edu/pythonlibs/u2yrk7ps/wordcloud-1.4.1-cp36-cp36m-win_amd64.whl 2安装过 ...
- 【笔记】关于TCP三次握手和四次挥手的理解
1. 三次握手: 服务器一定处于Listen状态,否则客户端发过来的连接会被拒绝.注:服务器和客户端的角色是相对的. 客户端发送第一次握手(客户端发送连接请求(SYNC包)到服务器)之后由Closed ...
- 实现body背景拉伸自适应 兼容chrome ie7,8,9.ie6未测试
html, body {/*此部分支持chrome,应该也支持firefox*/ background: rgb(246,248,249); background: url('/styles/imag ...
- VMware常见错误故障排查
1. VMware安装失败 “Failed to create the requested registry key Key:installer Error:1021" 1.1. windo ...
- 安装VMware,Linux
不是每一个程序员都必须玩过linux,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,但是很多生产上的框架和工具都是安装在服务器上的,而且有不少 ...