2013-03-27 2 views
1

정적 빛 (카메라의 움직임에 변하지 않음)을 만들어야하고 조각 쉐이더에서 빛의 실제 위치를 얻어야합니다. 있다는Three.js 빛이 정적이 아닙니다.

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

문제 : 나는 균일 변수 설정

 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; 

및 복셀 빛을 계산 무엇 지금하고 있는가

그것은 올바르게 작동하지 않습니다. 내 생각은, 나는 (사실 카메라로) 물체로 움직일 것이다. 빛은 같은면에서 여전히 빛날 것입니다 (장면에서는 정적 일 것입니다). 이때 빛은 정적이지 않고 매우 이상하게 작동합니다.

아이디어가 있으십니까? 누군가 제발 ...

탱크가 많이 있습니다. 토마스

답변

1

대신 PointLight와보십시오. SpotLight은 약간 사용하기가 까다 롭습니다.

+0

나는 PointLight를 시도했으나 좋지는 않지만 좋았습니다. float dProd = max (0.0, dot (getGradient (posInCube), normalize (normalize (pointLightPosition)\t voxelColored.rgb = voxelColored.rgb * dProd + voxelColored.rgb * 0.2; – Xrew

+0

나는 해결책을 찾았습니다. 세계 공간에서 큐브의 복셀 위치는 없었습니다. - [ou .. . :( – Xrew

0

위치에 다음 카메라에 추가하지 않지만, 대신에 현장에 추가하여 빛이 정적 만들려면 :

scene.add (빛);

위치 참조를 찾으려면 조명에 사용한 변수를 찾으십시오.

light.position

+0

나는 내 문제가 잘못되었다고 생각합니다. 나는 카메라 공간에서 정적 인 자세가 필요하다. 이상적인 예 -> 카메라는 손전등입니다. 빛의 위치는 사체 위치와 같습니다. 그러나 그것은 작동하지 않습니다. : ( – Xrew

관련 문제