2013-03-06 3 views
1

현재 오브젝트 경계 상자의 각 모서리를 가져 와서이를 Normalized Device Coordinates (NDC)로 변환하고 최대 및 최소 NDC를 추적합니다. 나는 NDC의 중간을 계산하고, 세계에서 찾아 내 카메라를 보게한다.화면에 3D 오브젝트를 센터링 할 수 없습니다.

<Determine max and minimum NDCs> 

centerX = (maxX + minX)/2; 
centerY = (maxY + minY)/2; 

point.set(centerX, centerY, 0); 
projector.unprojectVector(point, camera); 
direction = point.sub(camera.position).normalize(); 
point = camera.position.clone().add(direction.multiplyScalar(distance)); 

camera.lookAt(point); 
camera.updateMatrixWorld(); 

대략적인 방법일까요? 나는 그것이 몇 군데에서 제안 된 것을 보았다. 나는 물체를 중앙에 배치 할 때마다 최소 및 최대 NDC가 다시 계산 될 때 (다른 변경이 이루어지기 전에) 평등해야하지만 그렇지 않은 것이기 때문에 질문합니다. 나는 가깝지 만 동등하지 않은 수 (음수 부호는 무시함)를 얻었고, 더 가깝게 가까워 질수록 숫자 사이의 '오차'가 점점 커짐. 첫 번째 몇 센터에 대한 IE의 오류는 0.0022566539084770687, 0.00541687811360958, 0.011035676399427596, 0.025670088917273515, 0.06396864345885889 등입니다.

내가 이것을 놓치고있는 단계가 있습니까?

나는이 코드를 while 루프의 일부로 사용하여 화면에서 객체를 최대화하고 가운데에 배치합니다. (사용자가 표제를 입력 할 수 있도록 프로그래밍 중이므로 표제와 표고에서 객체를 볼 수 있도록 카메라가 배치됩니다. 몇 주 후 (현재는) 이런 식으로하십시오.)

그러나 이것은 카메라를 내 물건으로 가까이 이동할수록 떨어져 나가는 것처럼 보입니다. 예를 들어 몇 번의 반복을 거친 후 내 최대 X NDC는 0.9989318709122867이고 최소 X NDC는 -0.9552042384799428입니다. 계산 된 점을 살펴보면 너무 삐뚤어져 내 다음 반복에서 max x NDC는 0.9420058636660581이고 min X NDC는 1.0128126740876888입니다.

답변

0

첫 번째 문제가 발생했습니다. 닭고기 또는 계란. 카메라 속성을 변경할 때마다 NDC 공간에서 객체가 투영되는 위치를 효과적으로 변경합니다. 그래서 당신이 가까이 다가 가고 있다고 생각하더라도 결코 거기에 도착하지 않을 것입니다.

다른 각도에서 문제를보십시오. 카메라를 어딘가에 배치하고 가능한 정준 (canonical) (예 : 1 종횡비)으로 만들고 카메라 z 축을 기준으로 개체를 배치하십시오. 이것은 가능하지 않습니까?

1

이 문제에 대한 접근 방식이 잘못되었습니다. 화면 좌표의 관점에서 이것을 생각하기보다는 장면의 용어에 대해 생각해보십시오.

카메라의 광선이 객체의 중앙에 도달하도록 카메라의 이동량을 계산해야합니다. 당신이 필드에 서 있다고 상상해보십시오. Alex와 Burt의 두 사람이 맞습니다. Burt는 Alex의 오른쪽 2 미터에 서 있습니다. 현재 Alex에게 직접보고 있지만 선회없이 Burt를보고 싶습니다. 그들 사이의 거리와 방향을 아는 경우 2 미터 오른쪽으로. 그 거리와 방향, 즉 오른쪽과 2 미터 만 이동하면됩니다. 수학적 맥락에서

는 다음을 수행해야합니다 방향, 즉 접선을

당신이 3 차원 공간에 초점을 맞추고있다 물체의 중심을 취득하고 카메라에 평행 한 평면 프로젝트 카메라가 마주하고있어 그 지점에 앉아 있습니다.

카메라가 카메라 방향을 향한 평면으로 카메라 레이크 캐스트 한 다음, 대상의 중심점과 카메라에서 비행기를 치는 점의 결과적인 차이가 카메라 이동에 필요한 양입니다. 이것은 카메라와 물체의 방향이나 위치에 관계없이 작동해야합니다.

관련 문제