2016-12-23 5 views
2

나는 카메라의 애니메이션을 가지고 있고, 나는 2d 스프라이트 쉐이더에 움직임의 각도를 전달하고자한다. 나는이 두 벡터를 카메라에 투영 한 다음 각도를 계산해야한다고 생각하지만 작동하지 않습니다.카메라의 움직임 벡터의 각도를 얻는 방법

let prevCameraVector = null; 
function tick() { 
    if(prevCameraVector && !prevCameraVector.equals(camera.position)) { 
    let vector1 = prevCameraVector; 
    let vector2 = new THREE.Vector3(camera.position.x, camera.position.y, camera.position.z); 

    vector1.project(camera); 
    vector2.project(camera); 
    let angle = vector1.angleTo(vector2); 

    uniforms.uRotate.value = angle; 
    } 
    prevCameraVector = new THREE.Vector3(camera.position.x, camera.position.y, camera.position.z); 
} 

답변

0

나는 모션 블러가있는 예제를 발견하고 그 알고리즘을 사용했습니다. 이제 작동합니다. http://www.zeropointnine.com/blog/motion-blur-shader/

let prevCameraVector = null; 
function tick() { 
    if (prevCameraVector && !prevCameraVector.equals(camera.position)) { 
     let vector1 = prevCameraVector; 
     let vector2 = new THREE.Vector3(camera.position.x, camera.position.y, camera.position.z); 

     vector1.project(this.camera); 
     vector2.project(this.camera); 

     vector2.sub(vector1); 
     vector2.y *= window.innerWidth/window.innerHeight; 
     let angle = Math.atan2(vector2.x, vector2.y); 

     uniforms.uRotate.value = angle; 
    } 
    prevCameraVector = new THREE.Vector3(camera.position.x, camera.position.y, camera.position.z); 
} 
+0

는 몇 번 초당 당신의 새로운'Vector3's를 인스턴스화하는거야? 하나 또는 두 개를 만들고 다시 사용하십시오. 또한,'vec.copy (camera.position)'를 사용할 수 있습니다. – WestLangley

+0

'requestAnimationFrame'을 호출합니다. 그렇기 때문에 약간 성능이 떨어질 수 있습니다. 팁 주셔서 감사! – RED