在OpenGL ES中获取眼睛的位置坐标



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);

或者需要额外的转换?

注意:阅读帖子眼睛空间坐标到底是什么?但我仍然心存疑虑,因为我的雾着色器不起作用。在该着色器中,计算从观察者到对象的距离:

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));
...
}

提前感谢!

解决方案:根据Rabbid76的建议,我使用了length((函数以及模型视图矩阵。

uniform mat4 u_mvMatrix; // model-view matrix
in vec4 a_position;
out float v_eyeDist;
...
void main() {
...
vec4 viewPos = u_mvMatrix * a_position;
v_eyeDist = length(viewPos);
...
}
视图矩阵从世界空间转换到视图空间。视图空间是由场景上的视点定义的局部系统。视图的位置、视线和视图的向上方向定义了相对于世界坐标系的坐标系
视图空间的原点是"眼睛"位置,因此在视图空间中,"眼睛"的位置位于(0,0,0(。

在glsl中,到点的距离可以通过内置函数distance来计算。计算分量xyz(笛卡尔坐标(的欧几里得距离就足够了,因为w分量(齐次坐标(对于两个向量都是1。例如:

v_eyeDist = distance(viewPos.xyz, eyePos.xyz);

由于视点(相机的位置(在viespace中是(0,0,0(,因此计算视图向量的长度就足以计算距离。点到坐标系原点的距离是向量到该点的长度。在glsl中,这可以通过内置函数length来计算。在这种情况下,重要的是计算分量xyz的长度,并排除w分量。包含w组件会导致错误的结果:

v_eyeDist = length(viewPos.xyz);

最新更新