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,相机无法确定右轴,进而无法确定上轴,无法渲染任何画面。

相关推荐
格林威6 小时前
工业相机参数解析:曝光时间与运动模糊的“生死博弈”
c++·人工智能·数码相机·opencv·算法·计算机视觉·工业相机
格林威8 小时前
工业相机图像采集:Grab Timeout 设置建议——拒绝“假死”与“丢帧”的黄金法则
开发语言·人工智能·数码相机·计算机视觉·c#·机器视觉·工业相机
格林威1 天前
工业相机图像高速存储(C++版):RAID 0 NVMe SSD 阵列暴力提速,附海康实战代码!
开发语言·c++·人工智能·数码相机·计算机视觉·工业相机·堡盟相机
rit84324991 天前
光场相机成像过程及空间域重对焦仿真
数码相机
YMWM_1 天前
相机端口查看和相机实时显示
数码相机
XuanTao771 天前
【分享】✍️手写生成器|高级版|轻松生成自然逼真手写字体
数码相机·计算机网络·网络安全·智能手机·软件工程
菩提树下的凡夫1 天前
3D相机如何获取高精度的xyz
数码相机·3d
格林威1 天前
工业相机图像高速存储(C++版):RAID 0 NVMe SSD 阵列方法,附堡盟相机实战代码!
开发语言·c++·人工智能·数码相机·opencv·计算机视觉·视觉检测
He BianGu2 天前
【项目】Vision Master OpenCV 4.0 版本发行说明
数码相机
双翌视觉2 天前
高精度视觉对位实现键盘线路薄膜定位纠偏
数码相机·计算机外设