由世界坐标系转换到摄像机坐标系的lookAt()函数
在学习图形学和opengl的时候,都涉及到坐标转化,从物体坐标转换为世界的坐标,从世界的坐标转换为摄像机的坐标。
在世界坐标到摄像机转换的过程中常用lookAt函数得到转化矩阵。GLM官方文档对它的解释是:
detail::tmat4x4<T> glm::gtc::matrix_transform::lookAt
(
detail::tvec3< T > const & eye,
detail::tvec3< T > const & center,
detail::tvec3< T > const & up
)
前面两个参数都比较好理解,eye代表了摄像机在世界坐标系的坐标,center是观察点,通过center-eye可以得到观察向量,通过glm::perspective可以设置视角。
那么up呢?up代表的什么意思,大多文档都说这个参数一般值是(0,1,0)如果要倒着看就是(0,-1,0)。stackoverflow上给出的的答案是:
- The
upvector is basically a vector defining your world's "upwards" direction. In almost all normal cases, this will be the vector(0, 1, 0)i.e. towards positive Y.
glm::mat4 View = glm::lookAt(
glm::vec3(0, 0, 3),
glm::vec3(0, 0, 0),
glm::vec3(0, 1, 0)
);
此时摄像机正向观察三角形
,得到的三角形观察是

glm::mat4 View =
glm::lookAt(glm::vec3(, , ), glm::vec3(, , ), glm::vec3(, , ));
得到与上图对比结果:

我的肉眼看不出区别,也就是没有区别。
按照stackoverflow的解释,up代表世界坐标的上方向。但是这里我的方向都偏到Z轴去了,而三角形完全没有变化。也就是stackoverflow给出的是错误答案
研究了一下lookAt的实现,如下:
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<, , T, Q> lookAtRH(vec<, T, Q> const& eye, vec<, T, Q> const& center, vec<, T, Q> const& up)
{
vec<, T, Q> const f(normalize(center - eye));
vec<, T, Q> const s(normalize(cross(f, up)));
vec<, T, Q> const u(cross(s, f)); mat<, , T, Q> Result();
Result[][] = s.x;
Result[][] = s.y;
Result[][] = s.z;
Result[][] = u.x;
Result[][] = u.y;
Result[][] = u.z;
Result[][] =-f.x;
Result[][] =-f.y;
Result[][] =-f.z;
Result[][] =-dot(s, eye);
Result[][] =-dot(u, eye);
Result[][] = dot(f, eye);
return Result;
}
通过这段源码可以得到,lookAt重新定义了摄像机坐标系。我们知道空间垂直坐标系有3条轴,第一条就是center - eye也就是摄像机观察制定点的向量,这里可以把他当做Z轴。第二条轴就是f,和up的×值。也就是说up代表的根本不是什么世界正上方而是一条”辅助向量",通过这个辅助向量能得到摄像机的坐标系的X轴。而当up(0,1,0)时摄像机转角正好为0。已知x轴和z轴自然能得出y轴,这样就定义了摄像机坐标轴。
也就是说up是一条辅助向量,它确实能控制摄像机的旋转方向,他与center - eye共同控制了摄像机的旋转面
由世界坐标系转换到摄像机坐标系的lookAt()函数的更多相关文章
- Three.JS 从世界坐标系转换到屏幕坐标系
var projector = new THREE.Projector(); var world_vector = new THREE.Vector3(0,0,1); var vector = pro ...
- ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)
原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是 ...
- [转]字符型IP地址转换成数字IP的SQL函数
使用SQL函数可以实现许多的功能,下面为您介绍的是字符型IP地址转换成数字IP的SQL函数示例,供您参考,希望对您学习SQL函数能够有所帮助. /**//*--调用示例 sele ...
- 在LoadRunner中转换字符串大小写的C语言函数
在LoadRunner中转换字符串大小写的C语言函数 . loadrunner语言ccharacterstringaction 封装ConvertToXXX函数: //ConvertToUpper f ...
- JS把数字金额转换成中文大写数字的函数
//把数字金额转换成中文大写数字的函数 function num2rmb ($num){ $c1="零壹贰叁肆伍陆柒捌玖"; $c2="分角元拾佰仟万拾佰仟亿" ...
- CAD输出的局部平面坐标数据配准转换到WGS84坐标系
局部平面坐标 平移纠正到常用平面坐标系下的坐标 转换后的地理坐标 采用两 ...
- ArcGIS坐标系转换出错:Error 999999执行函数出错 invalid extent for output coordinate system
本文主要介绍在用ArcGIS做坐标系转换过程中可能会遇到的一个问题,并分析其原因和解决方案. 如下图,对一份数据做坐标系转换: 过了一会儿,转换失败了.错误消息如下: “消息”中提示,“执行函数出错 ...
- 转:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)
对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而 ...
- Unity通过世界坐标系转换到界面坐标位置
public static Vector2 WorldToCanvasPoint(Canvas canvas, Vector3 worldPos) { Vector2 pos; RectTransfo ...
随机推荐
- [LC] 76. Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- SpringMVC静态资源拦截的问题
通常在web.xml中的核心控制器的DispatcherServlet中的url-pattern属性配置成类似“/”的拦截路径,但是会出现静态资源找不到的问题,比如js脚本.图片.css等无法加载,那 ...
- 移动端Video标签踩坑记录
需求 用户能在手机上上传视频并预览. 问题 上传完成后安卓下封面展示正常,ios下封面空白.如下图所示: 利用canvas截取视频第一帧发现,ios下截取到的第一帧一直是空白图片, 安卓正常. 后端利 ...
- css3 transform 变形属性详解
本文主要介绍了css3 属性transform的相关内容,针对CSS3变形.CSS3转换.CSS3旋转.CSS3缩放.扭曲和矩阵做了详细的讲解.希望对你有所帮助. 这个很简单,就跟border-rad ...
- OpenCV Laplace 算子
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...
- Django中查询相关操作
查询集特性 1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询. 2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个 ...
- jmeter压测遇到的问题
一.今天压力测试时,开始12秒后出现了很多异常, 都是 java.net.NoRouteToHostException: Cannot assign requested address. 1.首先我这 ...
- SpringBoot自动配置的原理
Spring Boot的运行是由注解@EnableAutoConfiguration提供的它的关键功能是@Import注解. EnableAutoConfigurationImportS ...
- 一些JavaScript中原理的简单实现
实现一个双向数据绑定 Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象.通过这个属性可以实现简单的双向数据绑定,当前版 ...
- java文件压缩ZipOutPutStream
其实最好的书籍就是javaAPI 1.创建ZipOutPutStream流,利用BufferedOutputStream提个速. 2.新建zip方法,用来压缩文件,传参 3.zip方法利用putNex ...