使用旋转网格根据摄像机位置定位three.js材质

时间:2016-10-01 21:10:41

标签: three.js webgl

我有一个问题,就是将一个threejs材质(自定义片段着色器)朝向相机,在已旋转的网格上定向。

我正在寻找的效果是一个在中心看起来是透明的球体,并且朝向边缘逐渐变得更不透明。我的工作基于this demo。问题是,如果旋转网格,该技术将失败。

以下是问题的现场演示:http://palebluepixel.org/demos/threejs-rotation-question/

球体是相同的,但其中一个球体每帧都旋转一次(earthBad.rotation.y += 0.005;)。通过旋转它,球体的透明半部分随之旋转。

顶点着色器

根据法向量和视图向量之间的角度计算透明度的intensity

uniform vec3 spherePosition;
uniform vec3 cameraPosition;
varying float intensity;
varying vec2 vUv;
void main() 
{
    vec3 viewVector = cameraPosition - spherePosition;
    vec3 vNormal = normalize( normalMatrix * normal );
    vec3 vNormel = normalize( normalMatrix * viewVector );
    intensity = pow( 1.0 - dot(vNormal, vNormel), 0.5 );
    vUv = uv;

    gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

片段着色器

使用纹理贴图并使用intensity值覆盖Alpha通道。

uniform sampler2D sphereTexture;
varying float intensity;
varying vec2 vUv;
void main()
{

    vec4 fragColor = texture2D(sphereTexture, vUv);
    fragColor.a = intensity;
    gl_FragColor = fragColor;
}

当网格未旋转时,球体的透明半部分完全跟随相机。但是,当网格旋转时,透明的一半会随之旋转。

image of rotated mesh looking wrong

对于我的业余人士来说,在材质的着色器运行后,似乎three.js将旋转应用于网格。

我该如何解决这个问题?我尝试将网格物体quaternion拉入着色器,以为我可以将反向旋转应用于intensity计算,但数学算法没有找到。

0 个答案:

没有答案