【问题标题】:Get eye position coordinates in OpenGL ES在 OpenGL ES 中获取眼睛位置坐标
【发布时间】:2020-08-15 12:04:31
【问题描述】:

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)

那么这个向量用于shader中的眼睛坐标呢?:

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

提前致谢!

解决方案:根据 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);
    ...
}

【问题讨论】:

    标签: java android opengl-es glsl shader


    【解决方案1】:

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

    在 glsl 中,到点的距离可以通过内置函数 distance 计算。计算组件 xyz (Cartesian coordinates) 的 Euclidean distance 就足够了,因为对于两个向量,w 组件 (Homogeneous coordinates) 都是 1。例如:

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

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

    v_eyeDist = length(viewPos.xyz);
    

    【讨论】:

    • 感谢您的详细解释和链接!一如既往的好答案。
    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2011-08-05
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2013-03-23
    相关资源
    最近更新 更多