2014-06-24 6 views
1

OrbitControls에 의해 제어되는 카메라로 Three.js (r67)에 장면이 있습니다.카메라 회전으로 가장 가까운 카메라 위치로 점을 가져옵니다.

이제 장면에서 임의의 점 (Vector3)을 선택하면이 점 (프로그래밍 방식으로)을 카메라를 회전하여 가장 가까운 카메라 위치로 가져 오는 가장 좋은 방법은 무엇입니까? 아래 그림에서 예 시나리오


좌측 시작점이다. 카메라는 구의 중심이되는 녹색 구 (OrbitControls)를 중심으로 회전합니다. 이제 빨간색 상자가 카메라에 가장 가깝도록 (오른쪽과 같이) 구의 주위에서 카메라를 자동으로 회전시켜 (최소 이동량으로) 좋아합니다. enter image description here

답변

1

우물쭈물하지 않습니다. Oo 카메라의 중심점/목표점이 있습니다. 타겟 위치와 포인트 위치의 차이를 계산하고 벡터를 카메라 중심 거리의 길이로 정규화합니다 (즉, pointdistance.multiplyScalar (cameradistance.length()/pointdistance.length())).

그리고 그게 전부입니다. 너의 질문을 올바르게 이해했다면. 포인트의 위치를 ​​"카메라 이동 돔"으로 "연장"하면 새로운 카메라 위치가 이상적입니다. 항상 중심점을 대상으로하므로 카메라의 회전이 자동으로 수행됩니다.

카메라의 움직임을 부드럽게하려면 약간의 각도로 (예 : 위치가 아닌) 각도를 보간하면됩니다. 기하 급수적 인 기능, 당신이 선호하는 것.

2

장면의 포인트를 선택하는 방법과는 별도로 "카메라를 회전시켜 카메라를 가져 오는 것"이 ​​무엇을 의미하는지 이해할 수 있습니다.

나는 당신이 화면의 중앙에 선택한 지점을 만들기 위해 카메라를 그런 식으로 회전시키고 싶다고 가정합니다.

이는 간단하다 : 당신이 더 복잡 할 수

camera.lookAt(your_point_in_scene); 

. 먼저 현재 포인팅 벡터를 찾습니다. 기본적으로 카메라 방향은 Vector(0,0,1)입니다. 우리가 카메라와 같은 회전으로 회전 할 때, 우리는 카메라 방향이있을 것이다 :

var vec = new THREE.Vector3(0,0,1); 
vec.applyQuaternion(camera.rotation._quaternion); 

이제 우리는 우리의 카메라 및 축, 우리는 회전 것이다 주위를 회전하는 각도를 결정해야합니다. 회전축은 카메라 방향과 카메라의 교차 방향 벡터의 교차 곱으로 구할 수 있습니다.

// before animation started 
var total_rotation = 0, 
    rotateon, 
    avel = 0.01; // 0.01 radian per second  


if(total_rotation < angle){ 
    rotateon = avel * time_delta; 
    camera.rotateOnAxis(axis, angle); 
    total_rotation += rotateon; 
} 
1

안녕하세요 : 당신이 원활를 확인하려면

camera.rotateOnAxis(axis, angle); 

또는 : 천사가 내적에서 추출 할 수있다 :

var object_dir = object_world_point.clone().sub(camera.position); 
var axis = vec.clone().crossProduct(object_dir); 
var angle = Math.acos(vec.clone().dot(object_dir)/vec.length()/object_dir.length()); 

각도와 축을 갖는, 우리는 카메라를 회전 할 수 친애하는 이쪽을 따라 주시기 바랍니다 장면에서 포인트를 선택하는 방법과는 별도로 "회전만으로 카메라를 가져 오는 것"이 ​​무엇을 의미하는지 이해할 수 있습니다. 화면 중앙에 선택한 점을 만들기 위해 카메라를 회전시키고 싶습니다. 이 간단하다 :

camera.lookAt(your_point_in_scene); 

당신이 더 복잡 할 수 있습니다. 먼저 현재 포인팅 벡터를 찾습니다. 기본적으로 카메라는 Vector (0,0,1) 방향을 찾습니다. 우리가 카메라와 같은 회전으로 회전 할 때, 우리는 카메라 방향이있을 것이다 :

var vec = new THREE.Vector3(0,0,1); 
vec.applyQuaternion(camera.rotation._quaternion); 

이제 우리는 우리의 카메라 및 축, 우리는 회전 것이다 주위를 회전하는 각도를 결정해야합니다. 회전축은 카메라 방향과 카메라의 교차 방향 벡터의 교차 곱으로 구할 수 있습니다. 내적에서 각도를 추출 할 수 있습니다.

var object_dir = object_world_point.clone().sub(camera.position); 
var axis = vec.clone().crossProduct(object_dir); 
var angle = Math.acos(vec.clone().dot(object_dir)/vec.length()/object_dir.length()); 
관련 문제