2013-01-26 1 views
3

3D 공간 (이 경우 이미지)에서 물체와의 카메라 거리를 계산하려면 어떻게해야합니까? 이미지는 원래 픽셀 너비에 있습니다.카메라의 z 거리를 계산하여 3D 공간에서 원래의 눈금의 100 %로 이미지를 보는 방법

카메라의 가로 세로 비율, fov 및 이미지의 원래 너비/높이 (픽셀 단위)를 가정하면 맞습니까?

(관련이있는 경우이 특정 인스턴스에서는 THREE.js를 사용하고 있습니다).

올바른 방향으로 나를 도울 수있는 사람 덕분에!

답변

5

모두에게 감사드립니다.

일부 파기를 한 다음이 모든 것이 내가 THREE.js로 해결하려고했던 정확한 문제에 어떻게 부합 하는지를 확인한 후,이 질문에 대한 답은 자바 스크립트에서 대상 Z 거리로 표시 한 답변이었습니다. 원래 규모 :

var vFOV = this.camera.fov * (Math.PI/180), // convert VERTICAL fov to radians 

var targetZ = window.innerHeight/(2 * Math.tan(vFOV/2)); 

답변으로 표시 할 항목을 알아 내려고했지만이 모든 것을이 솔루션에 결합했습니다.

+0

평범한 2D 세계로 출현하면 az 값을 사용하여 장면을 초기화하는 "기본"이 있는지 궁금합니다. "실제 픽셀"을 렌더링합니다. 당신이 스 니펫을 이해하는 한,이게 무엇을하는지는 모르겠지만, 디폴트가 될 수 있거나/있어야한다고 느꼈다. – Ben

+0

@Ben 카메라를 초기화하거나 render() 함수와 함께이 계산을해야합니까? – rut2

2

삼각법 : 뷰 평면에 직각으로 상기 카메라에이 아크 탄젠트 가비 것이다에 수직 N의 거리 (l/n)도에서 길이 (L)의

선분. 간단한 삼각법으로 그 결과에 도달 할 수 있습니다.

따라서 라인의 방향으로 시야가 q이고 픽셀이 p 일 경우 결국은 p*arctan(l/n)/q 픽셀을 차지하게됩니다.

그래서, 화소의 출력 번호로서 Y를 사용 :

y = p*arctan(l/n)/q 
y*q/p = arctan(l/n) 
l/tan(y*q/p) = n 

선형 대수 : 90 °의 필드 뷰와 2w 화소 표시 영역 전체와 카메라

,

x' = w - w*x/z 

수직 스크린 상에 라인 길이가 정상 연관성 및 commutivi함으로써 이러한 두 XS의 차이가 너무 : 스크린 공간으로 투영에 상당 타이 규칙 :

따라서
l' = w - w*l/z 

:

w - l' = w*l/z 
z = (w - l')/(w*l) 

시야가 실제로 Q 학위보다는 당신이 코탄젠트를 사용할 수있는 90 적절하게 확장 할 수있는 경우.

+0

감사합니다. 나는 이것을 밖으로 시험 할 것이다. 내 fov는 실제로이 경우 45입니다. 그래서 방정식에서 z를 45의 코 탄젠트로 스케일합니다. – scottc

+0

첫 번째 삼각법 버전에서 fov가 45, 화면 해상도가 1024x768, 이미지 크기가 120x115 픽셀 인 경우 q = 45, p = 1024 * 768, l = 115 및 y = 120 * 115? 아니면 나는 완전히 오프베이스인가? – scottc

+0

아니요 - 모두 1 차원입니다. 빗변이 아닌 다른면을 내려다 본다면 직각 삼각형의 밑변의 길이를 생각해보십시오. – Tommy

0

original question에 css3D를 사용 중이라고하셨습니다.

fov = 1..179 도의 정사각형 카메라를 설정합니다. 여기서 left = screenWidth/2, right = screenWidth/- 2, top = screenHeight/2, bottom = screenHeight/2. near와 far 비행기는 내가 경험에서 알 수있는 한 CSS3D 렌더링에 영향을 미치지 않습니다. 1 화면에 대응 좌표 :

camera = new THREE.OrthographicCamera(left, right, top, bottom, near, far); 
camera.fov = 75; 

지금 당신은 객체가 위의 설정으로 카메라를 사용하여 예상 될 때, 객체가 하나가 가지고있는 같은 방법으로 카메라와 물체 사이의 거리를 계산해야합니다.이것은 다음과 같은 방법으로 수행 할 수 있습니다

var camscale = Math.tan((camera.fov/2)/180 * Math.PI); 
var camfix = screenHeight/2/camscale; 
  1. 장소에 위치하여 사업부 : X, Y, Z
  2. 설정 카메라의 위치로 0, 0, Z + camfix

이를 렌더링 된 결과 및 CSS/div 스타일의 픽셀 값과 1 : 1 좌표 대응을 제공해야합니다. 기원이 중심에 당신이 예를 들어 왼쪽 상단 모서리에서 사양을 조정 달성하기 위해 조정을 할 필요 있도록 객체의 위치가 객체의 중심이라는 것을 기억

object.x = (screenWidth - objectWidth)/2 + positionLeft 
object.y = (screenHeight - objectHeight)/2 + positionTop 
object.z = 0 

난이 도움이되기를 바랍니다, 나는이었다 똑같은 문제 (css3d 장면의 정확한 제어)로 어려움을 겪었지만 객체와의 직교 카메라 + 뷰포트 크기 조정 거리가 트릭을 만든다는 것을 알아 냈습니다. 카메라 회전이나 x 및 y 좌표를 변경하지 마십시오. z를 사용하면 안전합니다.