2013-03-27 66 views
1

我需要創建靜態光源(不變的移動相機),我需要在片段着色器中獲得光的實際位置。Three.js光不是靜態的

什麼我現在是這樣做的:

 scene = new THREE.Scene(); 
     camera = new THREE.PerspectiveCamera(60, canvas.width()/canvas.height(), 1, 10000); 
     camera.position.z = 2000; 
     camera.lookAt(0, 0, 0); 

     var light = new THREE.SpotLight(0xFFFFFF, 1); 
     light.position.set(0.5, 0.5, 0.1).normalize(); 
     camera.add(light); 

     .... 

     var lambertShader = THREE.ShaderLib['lambert']; 
     uniformsVolume = THREE.UniformsUtils.clone(lambertShader.uniforms); 

     .... 

     materialVolumeRendering = new THREE.ShaderMaterial({ 
      uniforms: uniformsVolume, 
      vertexColors: THREE.VertexColors, 
      vertexShader: vertVolumeRendering, 
      fragmentShader: fragVolumeRendering, 
      vertexColors: THREE.VertexColors, 
      lights :true 
     }); 

     .... 
     scene.add(camera); 

比片段着色器我設置統一的變量:

uniform vec3 spotLightPosition; 

和體素計算光:

float dProd = max(0.0, dot(getGradient(posInCube), normalize(lightPos 
- posInCube)));    
voxelColored.rgb = voxelColored.rgb * dProd + voxelColored.rgb * 0.2; 

問題是,它不能正常工作。我的想法是,我會用物體移動(實際上是用相機)。光會從同一側發光(在場景中將是靜態的)。這時光不是靜止的,工作很奇怪。

有什麼想法? 有人請...

坦克很多。 托馬什

回答

1

嘗試用PointLight代替。 SpotLight使用起來有點麻煩。

+0

我試過PointLight;它是更好但不好。 我現在這樣做: float dProd = max(0.0,dot(getGradient(posInCube),normalize(normalize(pointLightPosition) - 正常化(posInCube))); \t voxelColored.rgb = voxelColored.rgb * dProd + voxelColored.rgb * 0.2; – Xrew 2013-03-28 08:46:35

+0

我是noob ...我找到了解決方案,在世界空間的立方體werent中的體素位置: - [ou .. 。:( – Xrew 2013-03-28 20:42:29

0

爲了讓您輕靜態位置,那麼不要將它添加到你的相機,而是將其添加到場景:

scene.add(光);

要找到位置參考您用於燈光的變量。

light.position

+0

我想,我已經描述了我的問題不好。我需要在相機空間的靜態位置。理想的例子 - >相機是手電筒。光照位置與拍照位置相同。但它不工作.. :( – Xrew 2013-03-27 23:24:06