由世界坐标系转换到摄像机坐标系的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 ...
随机推荐
- Linux 账号管理及ACL权限设置,PAM模块简介
有效群组与初始群组: groups:有效与支持群组的观察 newgrp:有效群组的切换,后面接群组名称 在passwd文件中记录的GID就是默认的GID,就是初始群组 /etc/passwd文件结构 ...
- 【转】mac os x配置adb命令的方法,苹果电脑设置adb命令的方法
http://www.myexception.cn/operating-system/1636963.html 步骤如下: 1. 启动终端Terminal (如果当前用户文件夹下已有.bash_pro ...
- Invalid action class configuration that references an unknown class解决方案
Sturts2整合后时出现诡异的异常: java.lang.RuntimeException: Invalid action class configuration that references a ...
- OpenCV Canny 边缘检测
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...
- 3DSMAX安装未完成,某些产品无法安装的解决方法
3DSMAX提示安装未完成,某些产品无法安装该怎样解决呢?,一些朋友在win7或者win10系统下安装3DSMAX失败提示3DSMAX安装未完成,某些产品无法安装,也有时候想重新安装3DSMAX的时候 ...
- MongoDB的图形化连接工具MongoDB VUE
MongoDB的图形化连接工具MongoDB VUE 类似mysql的navicat.
- linux下的时区修改
Centos 7时区问题: 通常使用tzselect命令选择时区,今天在修改centos7的时区的时候,修改完以后时区还是没有发生变化,重启也是没有用的:通过网络的帮助了解到,在Centos和ubun ...
- zabbix的MariaDB数据库改变存储位置
#创建 mkdir /公司缩写/mysql #停止数据库服务 systemctl status mariadb.service systemctl stop mariadb.service # ...
- labview的bool(布尔)按键机械属性
在学习LabVIEW(简称LV)时,布尔控件是常用的控件.布尔控件分为按钮型控件和开关型控件,LV内部并没有区分按钮型还是开关型.这两种布尔控件可以根据需要相互转换,通过配置布尔控件的机械动作属性来实 ...
- Android开发常见错误
1.出现 “Unable to resolve target 'android-9'”,解决办法: 一般移植别人工程会出现此错误. 右键项目文件--->properties--->andr ...