熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可。下面先介绍下摄像机view矩阵的计算原理。此处假设知道摄像机位置eye,目标点位置target以及UP向量。
主要是u,v,w三个向量的计算:
1.w向量:
(1)计算向量eyeToTarget = eye - target;
(2)向量w 等于 向量eyeToTarget与向量UP的叉乘。
2.u向量:向量w与向量UP的叉乘
3.v向量:向量w与向量u的叉乘
使用以上三个向量,按照u,v,w的顺序组建4*4的矩阵,当然上面提到的u,v,w向量都是vec3类型的,每个向量构建矩阵时还缺少第四个分量,接下来分别计算三个向量对应的值:
4.w向量的第四个分量:向量w与eye的点乘
5.u向量的第四个分量:向量u与eye的点乘
6.v向量的第四个分量:向量v与eye的点乘
到此原理部分介绍完毕,下面给出iOS实现的代码:
1 GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, 2 float centerX, float centerY, float centerZ, 3 float upX, float upY, float upZ) 4 { 5 GLKVector3 ev = { eyeX, eyeY, eyeZ }; 6 GLKVector3 cv = { centerX, centerY, centerZ }; 7 GLKVector3 uv = { upX, upY, upZ }; 8 GLKVector3 w = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));//计算摄像机位置与目标点之间的向量,并进行规格化 9 GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, w)); 10 GLKVector3 v = GLKVector3CrossProduct(w, u); 11 12 GLKMatrix4 m = { u.v[0], v.v[0], w.v[0], 0.0f, 13 u.v[1], v.v[1], w.v[1], 0.0f, 14 u.v[2], v.v[2], w.v[2], 0.0f, 15 GLKVector3DotProduct(GLKVector3Negate(u), ev), 16 GLKVector3DotProduct(GLKVector3Negate(v), ev), 17 GLKVector3DotProduct(GLKVector3Negate(w), ev), 18 1.0f }; 19 20 return m; 21 }
时间: 2024-11-10 14:08:52