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

相关推荐
Helen_cai1 天前
OpenHarmony 权限动态申请封装(API Version23 + 适配版)
数码相机·华为·harmonyos
2601_957418801 天前
从 Demo 到商用:一个照片直播系统的 Android 相机连接实践
数码相机
取个名字太难了~2 天前
越用越便宜,越用越强大:影像 SDK 的边际成本递减与网络效应实践
android·数码相机·美颜·相机连接·demu
双翌视觉2 天前
晶圆光刻对准系统:半导体制造中的精准对位艺术
数码相机·制造
想要入门的程序猿2 天前
摄影测量学习()
数码相机·学习
ctrl_v助手2 天前
HALCON 学习笔记1
笔记·数码相机·学习·算法·计算机视觉
科技圈观察2 天前
水印相机防造假验真实测:一张P过的假照片,测出两款工具的真实差距
数码相机
格林威5 天前
网口相机 vs USB相机:区别与适用场景(选型不再纠结)
人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉·工业相机
大雷神5 天前
HarmonyOS 6.1 新能力实战:用“双镜记忆相机”把照片、地点与人重新连起来
数码相机·华为·harmonyos
2601_962502905 天前
竹席非平面基材点胶点钻设备:地形补偿与动态控胶的工程实现
数码相机