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);
...
}发布于 2020-05-01 05:46:03
视图矩阵从世界空间转换为视图空间。视图空间是由视点到场景定义的局部系统。视图的位置、视线和视点的向上方向,定义了一个相对于世界坐标系的坐标系。
视图空间的起源是“眼睛”位置,因此在视图空间中,“眼睛”位置位于(0,0,0)。
在glsl中,到点的距离可以用内置函数distance来计算.计算组件的欧氏距离 ( x、y、z (笛卡尔坐标) )就足够了,因为对于两个向量,w组件(齐次坐标)都是1。例如:
v_eyeDist = distance(viewPos.xyz, eyePos.xyz);由于视点(摄像机的位置)在视距中是(0,0,0),所以计算视图向量的长度,计算距离就足够了。点到坐标系原点的距离是矢量到点的长度。在glsl中,这可以由内置函数length计算。在这种情况下,重要的是计算组件x、y、z的长度,并排除w组件。包括w组件会导致错误的结果:
v_eyeDist = length(viewPos.xyz);https://stackoverflow.com/questions/61535032
复制相似问题