在学习图形学和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共同控制了摄像机的旋转面

 

最新文章

  1. scoi2010&amp;&amp;bzoj1858序列操作
  2. 什麼是 mvc
  3. golang的验证码相关的库
  4. Java学习中,常用的命令管理(Java 学习中的小记录)
  5. 通过javascript,使用struts2的ognl获取JavaBean的属性.
  6. ionic list item-radio checked
  7. django: db howto - 2
  8. Adobe Acrobat 9 Pro Extended 9.4简体中文完整免激活注册版
  9. Linux(Debain)环境安装WordPress
  10. ConcurrentHashmap中的size()方法简单解释
  11. jQuery基礎知識
  12. Python高级笔记(三) -- 私有化
  13. 新安装mysql,如何提升mysql安全性
  14. 搭建redis-sentinel(哨兵机制)集群
  15. Structs复习 访问web元素
  16. [Algorithm] Longest Substring Without Repeating Characters?
  17. (原)docker安装
  18. Java开发之上帝之眼系列教程前言&amp;目录
  19. SHT20 IIC总线驱动概述
  20. Communications link failure--分析之(JDBC的多种超时情况)

热门文章

  1. Java生成随机图片验证码
  2. spring boot 配置文件properties和YAML详解
  3. maven项目部署到tomcat中没有classe文件的问题汇总
  4. [LC] 221. Maximal Square
  5. caffe之mac环境下通过XCode调试C++程序
  6. pytorch的visdom启动不了、蓝屏
  7. response 画验证码
  8. leetcode笔记&mdash;&mdash;35.搜索插入位置 - CrowFea
  9. Android apk签名详解&mdash;&mdash;AS签名、获取签名信息、系统签名、命令行签名
  10. ckeditor 捕获键代码