3D应用程序具有静态摄像机:
float eyeX = 0.0f;
float eyeY = 0.0f;
float eyeZ = 0.0f;
Matrix.setLookAtM(viewMatrix, 0, eyeX, eyeY, eyeZ,
0f, 0f, -4f, 0f, 1.0f, 0.0f)
然后此矢量用于着色器中的眼睛坐标吗?:
const vec4 eyePos = vec4(0.0, 0.0, 0.0, 0.0);
或需要其他转换?
注意:阅读文章What exactly are eye space coordinates?,但我仍然有疑问,因为我的雾着色器无法正常工作。在此着色器中,将计算从观察者到对象的距离:
uniform mat4 u_vMatrix;
in vec4 a_position;
out float v_eyeDist;
const vec4 eyePos = vec4(0.0, 0.0, 0.0, 0.0);
...
void main() {
...
vec4 viewPos = u_vMatrix * a_position;
v_eyeDist = sqrt(pow((viewPos.x - eyePos.x), 2.0) +
pow((viewPos.y - eyePos.y), 2.0) +
pow((viewPos.z - eyePos.z), 2.0));
...
}
提前感谢!
视图矩阵从世界空间转换为视图空间。视图空间是本地系统,由场景上的视点定义。视图的位置,视线和视图的向上方向定义了相对于世界坐标系的坐标系。视图空间的原点是“眼睛”位置,因此在视图空间中“眼睛”位置为(0,0,0)。
在glsl中,到点的距离可以通过内置函数distance
计算。计算分量distance
,Euclidean distance,x
(y
)的z
就足够了,因为两个向量的Cartesian coordinates分量(w
)均为1。例如:]]
Homogeneous coordinates由于视点(摄影机的位置)在视域中是(0,0,0),因此计算视点矢量的长度并计算距离就足够了。点到坐标系原点的距离是向量到点的长度。在glsl中,可以通过内置函数
v_eyeDist = distance(viewPos.xyz, eyePos.xyz);
进行计算。在这种情况下,重要的是计算分量length
,length
,x
的长度,并排除y
分量。包含z
组件将导致错误的结果:
w