由世界坐标系转换到摄像机坐标系的lookAt()函数
2024-10-08 21:14:01
在学习图形学和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
up
vector 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.
对此我做了个测试,对于opengl画一个最简单的三角形,设置录像机参数
glm::mat4 View = glm::lookAt(
glm::vec3(0, 0, 3),
glm::vec3(0, 0, 0),
glm::vec3(0, 1, 0)
);
此时摄像机正向观察三角形
,得到的三角形观察是
接着我设置lookAt参数一个很离谱的参数
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共同控制了摄像机的旋转面
最新文章
- scoi2010&;&;bzoj1858序列操作
- 什麼是 mvc
- golang的验证码相关的库
- Java学习中,常用的命令管理(Java 学习中的小记录)
- 通过javascript,使用struts2的ognl获取JavaBean的属性.
- ionic list item-radio checked
- django: db howto - 2
- Adobe Acrobat 9 Pro Extended 9.4简体中文完整免激活注册版
- Linux(Debain)环境安装WordPress
- ConcurrentHashmap中的size()方法简单解释
- jQuery基礎知識
- Python高级笔记(三) -- 私有化
- 新安装mysql,如何提升mysql安全性
- 搭建redis-sentinel(哨兵机制)集群
- Structs复习 访问web元素
- [Algorithm] Longest Substring Without Repeating Characters?
- (原)docker安装
- Java开发之上帝之眼系列教程前言&;目录
- SHT20 IIC总线驱动概述
- Communications link failure--分析之(JDBC的多种超时情况)
热门文章
- Java生成随机图片验证码
- spring boot 配置文件properties和YAML详解
- maven项目部署到tomcat中没有classe文件的问题汇总
- [LC] 221. Maximal Square
- caffe之mac环境下通过XCode调试C++程序
- pytorch的visdom启动不了、蓝屏
- response 画验证码
- leetcode笔记&mdash;&mdash;35.搜索插入位置 - CrowFea
- Android apk签名详解&mdash;&mdash;AS签名、获取签名信息、系统签名、命令行签名
- ckeditor 捕获键代码