首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenGL ES中获取眼睛位置坐标

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

Stack Overflow用户
提问于 2020-05-01 00:25:54
回答 1查看 874关注 0票数 1

3D应用程序有一个静态摄像机:

代码语言:javascript
复制
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)

然后,这个矢量用于着色器中的眼睛坐标?:

代码语言:javascript
复制
const vec4 eyePos = vec4(0.0, 0.0, 0.0, 0.0);

还是需要额外的转换?

注意:读了眼睛空间坐标究竟是什么?的帖子,但我仍然有疑问,因为我的迷雾着色器不工作。在此着色器中,计算从观察者到对象的距离:

代码语言:javascript
复制
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()函数以及一个模型视图矩阵。

代码语言:javascript
复制
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);
    ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-01 05:46:03

视图矩阵从世界空间转换为视图空间。视图空间是由视点到场景定义的局部系统。视图的位置、视线和视点的向上方向,定义了一个相对于世界坐标系的坐标系。

视图空间的起源是“眼睛”位置,因此在视图空间中,“眼睛”位置位于(0,0,0)。

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

代码语言:javascript
复制
v_eyeDist = distance(viewPos.xyz, eyePos.xyz);

由于视点(摄像机的位置)在视距中是(0,0,0),所以计算视图向量的长度,计算距离就足够了。点到坐标系原点的距离是矢量到点的长度。在glsl中,这可以由内置函数length计算。在这种情况下,重要的是计算组件xyz的长度,并排除w组件。包括w组件会导致错误的结果:

代码语言:javascript
复制
v_eyeDist = length(viewPos.xyz);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61535032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档