视图矢量和法线之间的角度?

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

相当标准的GLSL问题。不幸的是,尽管我熟悉其背后的数学原理,但是我对webgl级别的实现不确定。着色器调试起来非常棘手。

我正在尝试在glsl着色器级别获取视图矢量和对象法线之间的角度。我正在使用threejs,但通过它们创建了自己的共享者。

这是顶点着色器的相关部分:

void main() {
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);

    vec3 nmalInWorld = normalize(normalMatrix * normal);
    vec3 camInWorld = cameraPosition;
    vec4 posInWorld = modelViewMatrix * vec4(position, 1.0);
    posInWorld /= posInWorld[3];
    angle = -dot(normalize(posInWorld - vec4(cameraPosition, 1.0)), normalize(vec4(nmalInWorld,1.0)));
    if(angle > 0.7){
      angle = 1.0;
    }else{
      angle = 0.0;
    }

我已经尝试过这种排列的几种排列方式,因此如果不必要的话,我事先表示歉意。我确实得到了与我想要的东西非常相似的东西–就相机角度而言,它肯定总是相同的,但由于某些我不了解的原因而没有居中。片段着色器仅直接将角度修补到色域。

enter image description here

如您所见,白点不在球体中间居中,这是预期的结果。我真的不明白为什么。也许它缺少透视变换应用程序?尝试没有成功。我认为在这种情况下视图矢量不应该是相关的,无论摄像机的目标是什么,球体都应保持相同的颜色。

three.js glsl webgl shader vertex-shader
1个回答
1
投票

[posInWorldvec4(cameraPosition, 1.0)vec4(nmalInWorld,1.0)Homogeneous coordinates

2的Dot productCartesianUnit vectors等于矢量之间的角度的Cosine

“ view”向量是从顶点位置到摄影机位置的归一化笛卡尔向量。当顶点位置被modelViewMatrix变换时,结果就是视图空间中的位置。摄像机的视图空间位置是(0,0,0),因为视图空间的原点是摄像机的位置:

vec4 posInView = modelViewMatrix * vec4(position, 1.0);
posInView /= posInView[3];

vec3 VinView = normalize(-posInView.xyz); // (0, 0, 0) - posInView

normalMatrix将向量从模型空间转换为视图空间:

vecr NinView = normalize(normalMatrix * normal);

VinViewNinView都是视图空间中的向量。前者从顶点指向摄影机,后者是顶点坐标处的曲面的法线向量。两个向量之间的角度的余弦值可以通过点积获得:

float NdotV = dot(NinView, VinView);
© www.soinside.com 2019 - 2024. All rights reserved.