3D 공간 (이 경우 이미지)에서 물체와의 카메라 거리를 계산하려면 어떻게해야합니까? 이미지는 원래 픽셀 너비에 있습니다.카메라의 z 거리를 계산하여 3D 공간에서 원래의 눈금의 100 %로 이미지를 보는 방법
카메라의 가로 세로 비율, fov 및 이미지의 원래 너비/높이 (픽셀 단위)를 가정하면 맞습니까?
(관련이있는 경우이 특정 인스턴스에서는 THREE.js를 사용하고 있습니다).
올바른 방향으로 나를 도울 수있는 사람 덕분에!
3D 공간 (이 경우 이미지)에서 물체와의 카메라 거리를 계산하려면 어떻게해야합니까? 이미지는 원래 픽셀 너비에 있습니다.카메라의 z 거리를 계산하여 3D 공간에서 원래의 눈금의 100 %로 이미지를 보는 방법
카메라의 가로 세로 비율, fov 및 이미지의 원래 너비/높이 (픽셀 단위)를 가정하면 맞습니까?
(관련이있는 경우이 특정 인스턴스에서는 THREE.js를 사용하고 있습니다).
올바른 방향으로 나를 도울 수있는 사람 덕분에!
모두에게 감사드립니다.
일부 파기를 한 다음이 모든 것이 내가 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));
답변으로 표시 할 항목을 알아 내려고했지만이 모든 것을이 솔루션에 결합했습니다.
삼각법 : 뷰 평면에 직각으로 상기 카메라에이 아크 탄젠트 가비 것이다에 수직 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 적절하게 확장 할 수있는 경우.
감사합니다. 나는 이것을 밖으로 시험 할 것이다. 내 fov는 실제로이 경우 45입니다. 그래서 방정식에서 z를 45의 코 탄젠트로 스케일합니다. – scottc
첫 번째 삼각법 버전에서 fov가 45, 화면 해상도가 1024x768, 이미지 크기가 120x115 픽셀 인 경우 q = 45, p = 1024 * 768, l = 115 및 y = 120 * 115? 아니면 나는 완전히 오프베이스인가? – scottc
아니요 - 모두 1 차원입니다. 빗변이 아닌 다른면을 내려다 본다면 직각 삼각형의 밑변의 길이를 생각해보십시오. – Tommy
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;
이를 렌더링 된 결과 및 CSS/div 스타일의 픽셀 값과 1 : 1 좌표 대응을 제공해야합니다. 기원이 중심에 당신이 예를 들어 왼쪽 상단 모서리에서 사양을 조정 달성하기 위해 조정을 할 필요 있도록 객체의 위치가 객체의 중심이라는 것을 기억
object.x = (screenWidth - objectWidth)/2 + positionLeft
object.y = (screenHeight - objectHeight)/2 + positionTop
object.z = 0
난이 도움이되기를 바랍니다, 나는이었다 똑같은 문제 (css3d 장면의 정확한 제어)로 어려움을 겪었지만 객체와의 직교 카메라 + 뷰포트 크기 조정 거리가 트릭을 만든다는 것을 알아 냈습니다. 카메라 회전이나 x 및 y 좌표를 변경하지 마십시오. z를 사용하면 안전합니다.
평범한 2D 세계로 출현하면 az 값을 사용하여 장면을 초기화하는 "기본"이 있는지 궁금합니다. "실제 픽셀"을 렌더링합니다. 당신이 스 니펫을 이해하는 한,이게 무엇을하는지는 모르겠지만, 디폴트가 될 수 있거나/있어야한다고 느꼈다. – Ben
@Ben 카메라를 초기화하거나 render() 함수와 함께이 계산을해야합니까? – rut2