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

问题描述 投票:1回答:1

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

提前感谢!

java android opengl-es shader
1个回答
0
投票

视图矩阵从世界空间转换为视图空间。视图空间是本地系统,由场景上的视点定义。视图的位置,视线和视图的向上方向定义了相对于世界坐标系的坐标系。视图空间的原点是“眼睛”位置,因此在视图空间中“眼睛”位置为(0,0,0)。

在glsl中,到点的距离可以通过内置函数distance计算。计算分量distanceEuclidean distancexy)的z就足够了,因为两个向量的Cartesian coordinates分量(w)均为1。例如:]]

Homogeneous coordinates

由于视点(摄影机的位置)在视域中是(0,0,0),因此计算视点矢量的长度并计算距离就足够了。点到坐标系原点的距离是向量到点的长度。在glsl中,可以通过内置函数v_eyeDist = distance(viewPos.xyz, eyePos.xyz); 进行计算。在这种情况下,重要的是计算分量lengthlengthx的长度,并排除y分量。包含z组件将导致错误的结果:

w
© www.soinside.com 2019 - 2024. All rights reserved.