我需要定位一个THREE.Mesh实例,使其始终面向相机。我知道可以使用[THREE.Mesh].lookAt()方法,但我想更多地学习GLSL,希望能够在顶点着色器中完成。
我已经阅读了NeHe的广告牌教程,这让我感觉很有道理。除了将这些方向向量应用于每个顶点的部分之外。
我觉得我离让它工作很近了,但是目前为止,我的顶点着色器看起来更像90年代的狂欢视频而不是广告牌:
进展到现在的fiddle:http://jsfiddle.net/RZ4XE/2/ 以下是我的顶点着色器(片段着色器只分配一个vec4颜色)。它使用了THREE.js提供的各种默认uniforms/attributes,下面列出了这些内容,以防有人不熟悉THREE.js。 :)
我已经阅读了NeHe的广告牌教程,这让我感觉很有道理。除了将这些方向向量应用于每个顶点的部分之外。
我觉得我离让它工作很近了,但是目前为止,我的顶点着色器看起来更像90年代的狂欢视频而不是广告牌:
进展到现在的fiddle:http://jsfiddle.net/RZ4XE/2/ 以下是我的顶点着色器(片段着色器只分配一个vec4颜色)。它使用了THREE.js提供的各种默认uniforms/attributes,下面列出了这些内容,以防有人不熟悉THREE.js。 :)
cameraPosition
(vec3),position
(vertex position, another vec3),projectionMatrix
(camera's projectionMatrix, mat4),modelViewMatrix
(camera.matrixWorldInverse * object.matrixWorld, mat4)void main() { vec3 look = normalize( cameraPosition - position ); if( length( look ) == 0.0 ) { look.z = 1.0; } vec3 up = vec3( 0.0, 1.0, 0.0 ); vec3 right = normalize( cross( up, look ) ); up = normalize( cross( look, right ) ); mat4 transformMatrix; transformMatrix[0][0] = right.x; transformMatrix[0][1] = right.y; transformMatrix[0][2] = right.z; transformMatrix[1][0] = up.x; transformMatrix[1][1] = up.y; transformMatrix[1][2] = up.z; transformMatrix[2][0] = look.x; transformMatrix[2][1] = look.y; transformMatrix[2][2] = look.z; gl_Position = projectionMatrix * modelViewMatrix * transformMatrix * vec4( position, 1.0 ); }
提前感谢。
mesh.quaternion = camera.quaternion;
,并使用任何three.js材质(http://jsfiddle.net/RZ4XE/3/)... 或者使用THREE.Sprite。 - WestLangley