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

相关推荐
美摄科技10 小时前
智能硬件如何增加一键成片剪辑功能?
数码相机·智能手机·智能硬件
蒲公英内测分发12 小时前
智能家居厂商有多个产品线,包装上的 App 下载入口该共用还是分开?
android·人工智能·数码相机·机器人·智能家居·智能硬件
FLJwu13 小时前
运动相机图像传感器选型实战|第二篇:参数看着一模一样,为什么骑行录像疯狂果冻、拖影翻车?
android·c语言·开发语言·数码相机·运动相机·oem 量产
小蒋观天下3 天前
【无标题】红外补光近距过曝、远距欠曝:导致车牌AI识别失效调试
人工智能·深度学习·数码相机·算法·机器学习·ai大模型
星马梦缘3 天前
JetAuto VLN语义目标探索
人工智能·数码相机
LittroInno4 天前
双光对齐为何静态正常动态错位 从时间同步到曝光中心
数码相机·时间同步·图像配准·热红外·可见光·双光融合
济南凡维4 天前
智能相机 VS 工业相机:机器视觉选型一次讲透
网络·数码相机·视觉检测
FLJwu5 天前
运动相机采购选型避坑实战|第二篇
c语言·开发语言·数码相机·运动相机·oem 量产
kyle~5 天前
时间同步 --- PTP 与 Scheduled Action Command
c++·数码相机·机器人·传感器
PHOSKEY6 天前
光学棱镜角度有多重要?从手机潜望式镜头看一键闪测仪的检测价值
数码相机·智能手机