OpenGL lookAt 函数 参数说明

首先我们有一个固定的世界坐标系,这个坐标系是右手系,+X轴平行屏幕向右,+Y轴垂直屏幕向上,+Z垂直穿出屏幕向外。

lookAt函数是在我们向世界坐标系中放置了一系列3D元素之后,用于设置观察视角的函数。

void lookAt(const QVector3D& eye, const QVector3D& center, const QVector3D& up);

你可以把它想象成一个真实的摄影师:

cameraPos (eye):摄影师站立的位置。

center (target):摄影师镜头的朝向。

up (up vector):摄影师头顶的朝向。

通常情况下,摄影师站着,头顶自然朝向天空(世界坐标系的 +Y 轴)。但摄影师也可以歪着头拍照,对吧?这个 up 向量,就是告诉计算机,摄影师希望把头歪向哪个方向。

lookAt 在背后做了什么?

lookAt 函数的目标是创建一套属于相机自己的、全新的三维坐标系(包含右、上、前三个互相垂直的轴),然后用这个坐标系来观察世界。它的计算步骤如下:

计算"前"轴 (Forward Axis):这个最简单,就是从 cameraPos 指向 center 的方向。我们叫它 direction 轴。 direction = normalize(center - cameraPos)

计算"右"轴 (Right Axis):为了得到一个与 direction 轴垂直的"右"轴,计算机需要另一个参考向量。这时,你提供的 up 向量就派上用场了。它通过计算 up 向量和 direction 向量的叉乘(Cross Product),得到一个同时垂直于它俩的新向量,这个新向量就是相机的"右"轴。 right = normalize(cross(up, direction))

计算"真·上"轴 (Real Up Axis):现在我们已经有了互相垂直的 direction 轴和 right 轴,再次对它俩进行叉乘,就能得到那个最终的、与前两者都垂直的、相机自己真正的"上"轴。 realUp = cross(direction, right)

"Up Vector"的黄金法则:

提供给 lookAt 的 up 向量,绝对不能与你的视线方向(从 cameraPos 到 center 的连线)平行。否则叉乘结果为0,相机无法确定右轴,进而无法确定上轴,无法渲染任何画面。

相关推荐
椰椰气泡21 小时前
CCD照片导出后模糊怎么办?AI清晰度修复实测教程
图像处理·人工智能·数码相机
AI浩1 天前
CityFlow:面向多目标多相机车辆跟踪与重识别的城市级基准
数码相机
AGV算法笔记1 天前
OpenCV 二维码三维定位 普通摄像头也能测空间坐标
人工智能·数码相机·opencv·工业视觉· 机器人视觉
2601_957418801 天前
Android相机有线连接全链路技术解析:从协议栈到商业级实现
数码相机
博图光电2 天前
博图DVS相机,高速低延迟视觉感知首选
人工智能·数码相机
YANQ6622 天前
7.Gemini相机+yoloseg+foundationpose环境搭建及应用
数码相机
数智工坊2 天前
《计算机双目立体视觉》高宏伟:第3章-对极几何及其恢复方法
笔记·数码相机
双翌视觉2 天前
线扫描成像技术,高速运动物体的“无限视野”
人工智能·数码相机·计算机视觉
神仙别闹2 天前
基于QT(C++)+SQL Server 2008 实现相机租赁系统
开发语言·c++·数码相机
数智工坊2 天前
《计算机双目立体视觉》高宏伟:第5章-三维重建
笔记·数码相机