Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 视图向量和法线之间的角度?_Three.js_Glsl_Webgl_Shader_Vertex Shader - Fatal编程技术网

Three.js 视图向量和法线之间的角度?

Three.js 视图向量和法线之间的角度?,three.js,glsl,webgl,shader,vertex-shader,Three.js,Glsl,Webgl,Shader,Vertex Shader,相当标准的GLSL问题。不幸的是,尽管我熟悉它背后的数学原理,但我对webgl级别的实现并不是很确定。而且着色器的调试相当棘手 我试图在glsl着色器级别获得视图向量和对象法线之间的角度。我正在使用threejs,但通过它们创建我自己的共享者 以下是顶点着色器的相关部分: void main(){ gl_位置=projectionMatrix*modelViewMatrix*vec4(位置,1.0); vec3 nmalInWorld=规格化(normalMatrix*normal); vec3

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

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

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

void main(){
gl_位置=projectionMatrix*modelViewMatrix*vec4(位置,1.0);
vec3 nmalInWorld=规格化(normalMatrix*normal);
vec3-camInWorld=摄像机位置;
vec4 posInWorld=modelViewMatrix*vec4(位置,1.0);
posInWorld/=posInWorld[3];
角度=-dot(规格化(posInWorld-vec4(cameraPosition,1.0)),规格化(vec4(nmalInWorld,1.0));
如果(角度>0.7){
角度=1.0;
}否则{
角度=0.0;
}
我已经尝试过这种安排的几种排列,所以如果它不必要的复杂,我提前道歉。我确实得到了一些与我想要的非常相似的东西-它当然在相机透视方面总是相同的,但由于我不理解的原因,它没有居中。碎片着色器只是直接将角度修补到一个颜色区域劳埃德


正如你所看到的,白点不在球体的中间,这是预期的结果。我真的不明白为什么。也许它缺少一个透视变换应用程序。尝试它没有成功。我不相信视图矢量应该是相关的,在这种情况下,球体应该保持颜色相同,而不管TARG。相机的et。

posInWorld
vec4(cameraPosition,1.0)
vec4(nmalInWorld,1.0)

2的值等于向量之间的角度的值

“视图”向量是从顶点位置到摄影机位置的标准化笛卡尔向量。当通过
modelViewMatrix
变换顶点位置时,结果是视图空间中的位置。摄影机的视图空间位置为(0,0,0),因为视图空间的原点是相机的位置:

vec4 posInView=modelViewMatrix*vec4(位置,1.0);
posInView/=posInView[3];
vec3-VinView=normalize(-posInView.xyz);/(0,0,0)-posInView
normalMatrix
将向量从模型空间转换到视图空间:

vecr-NinView=normalize(normalMatrix*normal);
VinView
NinView
都是视图空间中的向量。前者从顶点指向摄影机,后者是顶点坐标处曲面的法向量。
两个矢量之间夹角的余弦可以通过点积得到:

float NdotV=dot(NinView,VinView);

谢谢。我误解了modelViewMatrix背后的功能,我认为该功能已转移到world coords。一切正常。此解决方案工作正常。您可能会发现它很有用。我非常喜欢webglfundamentals。