c++ - 理解 GLM-openGL 中的相机翻译
问题描述
用于 openGL 的 GLM 数学库为构建lookAt matrix
.
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtLH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up)
{
vec<3, T, Q> const f(normalize(center - eye));
vec<3, T, Q> const s(normalize(cross(up, f)));
vec<3, T, Q> const u(cross(f, s));
mat<4, 4, T, Q> Result(1);
Result[0][0] = s.x;
Result[1][0] = s.y;
Result[2][0] = s.z;
Result[0][1] = u.x;
Result[1][1] = u.y;
Result[2][1] = u.z;
Result[0][2] = f.x;
Result[1][2] = f.y;
Result[2][2] = f.z;
Result[3][0] = -dot(s, eye); //#this
Result[3][1] = -dot(u, eye); //#this
Result[3][2] = -dot(f, eye); //#this
return Result;
}
一切都很好,除了我用 标记的最后三行中完成的翻译因素//#this
。平移必须针对相机的世界位置x, y and z
进行,而是针对相机的局部坐标和方向矢量的点积进行,这不可能相等。
考虑一种情况,其中vector 2*eye
(眼睛是相机的位置)作为(中心是目标位置)传递,vector center
然后相机的局部 z 轴将与方向矢量重合,从而为我们提供相机的平移因子[0,0,1]
,所以我们会基本上只沿着世界移动z-axis
(因为我们不移动相机,所以我们只会沿着 z 轴在负方向移动世界)这是我们不想要的。我在哪里漏掉了重点,或者为什么要为翻译这样做?
解决方案
glm::lookAt
定义视图矩阵。视图矩阵将顶点坐标从世界空间转换到视图空间。
eye
,center
和up
分别是世界空间中的位置向量,它们定义了相机在世界空间中的位置和方向。eye
,center
并up
定义视图空间。如果您通过此向量设置矩阵,则矩阵将从视图空间转换为世界空间。
由于视图矩阵必须做相反的事情(世界空间 -> 视图空间),所以视图矩阵是由和定义的矩阵的逆矩阵。是在这种空间情况下计算逆矩阵的优化算法。
注意, ,eye
center
up
glm::lookAt
s
u
f
当它们被分配到矩阵时被转置。
逆矩阵的平移不是矩阵的负平移。逆矩阵的平移必须考虑方向(旋转)。因此,必须旋转平移向量。(3d)向量通过 3x3旋转矩阵的旋转可以通过(与)轴向量和方向向量的 3点积计算(相同) 。( s
, u
, f
) 定义了一个 3x3 旋转矩阵,eye
并由该矩阵进行变换。
代码实际剂量是通过转置 ( s
, u
, f
) 连接旋转和通过-eye
(非常简化的伪代码)进行转换:
viewmatrix = transpose(rotation(s, u, f)) * translation(-eye)
推荐阅读
- python - 计算微卫星中 CGG 的数量
- python - Django CORS 允许来自非允许来源的请求
- google-apps-script - 删除 Google Apps 脚本中特定列中的所有空格
- google-cloud-functions - 从 Cloud Tasks 触发 HTTP Cloud Function 时出现 PERMISSION_DENIED 403 错误
- c# - PlatformNotSupportedException:此平台不支持 System.Data.OleDb
- python - 如何尝试解析两种不同的可能日期格式?
- shopify - 使用 Liquid Shopify 查找网站 slug
- python - 从 UNIX 转换时,Pandas 数据帧不包括一天中的时间
- reactjs - 赛普拉斯在我的 ts 文件旁边添加了 js 文件
- java - 使类的字段对于 json 转换是可选的