如何在现代OpenGL中添加视图矩阵?
从固定管线过渡到现代OpenGL:视图矩阵实操建议
哇,能从gluLookAt、glTranslate这类老API转过来,还搞定了模型矩阵让三角形正常移动,这已经很棒了!我当年转的时候踩了不少坑,给你分享些关于视图矩阵的实用经验:
- 先搞懂视图矩阵到底是什么:说白了,视图矩阵就是相机变换的逆矩阵。固定管线里
gluLookAt帮你把相机的位置、朝向这些参数打包成了矩阵,现在你得手动实现这个逻辑:- 先确定三个关键参数:相机位置
cameraPos、相机看向的目标点target、相机的初始上方向up(一般是(0,1,0)) - 计算相机的前向向量:
forward = normalize(target - cameraPos) - 计算右向向量:
right = normalize(cross(forward, up))——这里要注意,如果你的up和forward共线(比如相机直直朝上看),这个向量会出问题,所以之后要重新计算真正的上方向 - 修正上方向:
trueUp = normalize(cross(right, forward)) - 用这三个正交向量构建相机的局部坐标系矩阵,然后求逆就是视图矩阵。其实不用手动求逆,因为相机的变换是旋转+平移,逆矩阵就是平移的逆(把相机位置取反)加上旋转的转置(旋转矩阵是正交矩阵,转置等于逆),这样组合起来更高效。
- 先确定三个关键参数:相机位置
- 在着色器里正确组合矩阵:现代OpenGL里所有变换都在着色器里做,你需要把模型矩阵和视图矩阵作为
uniform传给顶点着色器,比如:
uniform mat4 model; uniform mat4 view; attribute vec3 aPosition; void main() { gl_Position = view * model * vec4(aPosition, 1.0); }
注意顺序!矩阵乘法是右结合的,所以先应用模型变换,再应用视图变换,这个顺序不能搞反。
- 先验证视图矩阵,再碰投影:既然你还没开始搞投影矩阵,可以先用正交投影(甚至暂时直接用
gl_Position的前三个分量,让OpenGL自动做透视除法)来测试视图矩阵是否生效——比如把相机往后移动,三角形应该看起来变小;绕着三角形旋转相机,视角也会跟着变,这就说明视图矩阵没问题了。
等视图矩阵跑通后,投影矩阵就简单多了:正交投影就是把指定的空间范围映射到标准化设备坐标;透视投影需要考虑视场角、宽高比、近远裁剪面,核心是把锥台形状的视锥体压缩成立方体,这个逻辑你可以参考gluPerspective的实现公式,手动构建矩阵就行。
慢慢来,你已经走在正确的路上了!
内容的提问来源于stack exchange,提问作者geizio
相关产品推荐
相关产品推荐

