두 배 가까이있는 물체가 두 배나 크게 나타 납니까?


16

그래서 레이어를 변경하여 Z 축을 따라 이동할 수있는 2D 게임을 만들려고했습니다. 깊이에 따라 2D 스프라이트를 스케일링하려고합니다.

한 번 누군가 누군가 나에게 2D 스프라이트가 많은 데모를 보여 주었고 스크롤하여 카메라의 깊이를 바꿀 수있었습니다. 따라서 확대 할 때 객체가 플레이어에 더 가까이 와서 더 크게 보입니다. 그런 다음 물체가 1 단위에 가까워지면 얼마나 커야하는지 궁금했습니다. 어떻게 계산하겠습니까? 그래서 그 사람은 나에게 다음과 같이 말했습니다. "사용하는 기본 규칙이 하나 있습니다.

자, 그것을 직접 테스트함으로써, 나는 규칙이 현실 세계에 적용되지 않는다는 것을 알고 있습니다;) 그러나 관점이나 무언가를 위해 실제 세계 계산에 사용되는 상수가 있습니까? 아니면 공식?

나는 이것이 그런 질문을하기 가장 좋은 곳이 아닐 수도 있다는 것을 알고 있지만, 이것이 게임 관련 질문에 사용하는 유일한 사이트이기 때문에 내 상황은 게임이기 때문에 시도해 볼 것이라고 생각했다. 또한 3D 게임과 관련이 있기 때문에 3D 원근법 및 행렬에 대한 모든 것을 알고있는 사람이 여기에있을 것으로 기대합니다.)

tl; dr :

"두 배 가까이있는 물체는 두 배나 크게 보인다"현실에서는 사실이 아니다. 그러나 어떤 상수 또는 공식이 올바른가요?


3
나는 대답이 무엇인지 전혀 알지 못하지만 어떻게 알아낼 수 있는지 알고 있습니다. 무언가 사진을 찍어보세요. 어쩌면 종이 조각 일 수도 있습니다. 서로 다른 알려진 거리에서 가져 와서 한 장의 종이로 차지하는 이미지의 양을 계산하고 그 비율을 결정하기 위해 약간의 수학을 수행하십시오. 재미있는 실험이 될 수 있습니다!
SpartanDonut

왜 아무도 자연 로그에 대해 언급하지 않았는지 궁금합니다.
Chad Harrison

4
왜 그렇지 않습니까? 나는 그것이 사실이라고 생각합니다.
Ivan Kuckir 2016 년

@hydroparadise이 질문과 자연 로그는 어떤 관련이 있습니까?
Nathan Reed

나는 단지 내가 여기에서 pedantic하고 있지만 "Twice as close"는 이상한 문구입니다. "반쯤 떨어져"있지 않아야합니까? '두 번'은 커지지 만, 무언가가 가까워지면 거리가 작아집니다.
MrVimes

답변:


19

일반적으로 시점과 이동 한 방향 및 시야각에 따라 사실입니다.

객체에 대한 관점의 예

첫 번째 카메라 뷰에서 빨간색 블록이 카메라 뷰에 수직이므로 객체가 완벽한 1 : 2 비율로 두 배 큰 것처럼 보입니다 (화살표가 이동 한 후 뷰의 가장자리에 닿는다는 점에 유의하십시오) 두 배 가까이)

두 번째는 45도 회전 한 동일한 크기의 블록입니다. 회전하면 아래쪽 가장자리가 더 이상 카메라와 위쪽 가장자리와 같은 거리에 있지 않으므로 SEEM은 1 : 2 비율로 올바르게 스케일되지 않지만 실제로는 두 배입니다 ( 파란색 블록에있는 것과 같은 멀리 떨어진 파란색 블록의 각도와 동일합니다.)

결론적으로 이것은 실제로 친구가 정확하고 개체에 대한 1 : 1 비율 ( "두 배 가까이, 두 배로 크게 나타남") 이 좋은 선택임을 의미합니다.



좋은 대답입니다! 사진은 확실히 더 명확합니다. 실제로 나는 얼굴 앞에서 내 손을 잡고 더 가까이 움직여 질문을 게시하기 전에 이것을 시도했기 때문에 지금은 정말 바보 같은 느낌이 든다. 그리고 나는 생각했다 : 아니 그것은 두 배 큰 느낌이 들지 않습니다 .... 나는 그것을 더 정확하게 측정해야합니다;) 관점은 재미있는 것입니다! 또한, Ifeel 나처럼 그림을 직접 내놓을 수 있었을 것입니다;) 그러나 큰 대답! 감사!
Berry

@Mason Wheeler-분류 : P
Tom 'Blue'Piddock

8

두 배 가까이있는 물체는 두 배나 크게 나타납니다. 탈레스 정리의 결과이며 실제 세계에서도 마찬가지입니다.

Thales의 정리는 원근 투영 의 핵심 수학적 도구 이며 그래픽 파이프 라인 (OpenGL 또는 DirectX)에서 원근 분할 로 알려진 것입니다 . 그것은 반드시 알아야 할 정리이며 언제 사용될 수 있는지 인식하는 법을 배웁니다.


훌륭한 참고 자료! Thales Theorem을 확실히 확인하고 그래픽 파이프 라인을 더 잘 이해하려고 노력할 것입니다.
Berry

7

실제로는 거의 사실입니다 (객체를 두 배 더 멀리 이동하면 반으로 크게 보입니다). 시청자가 움직일 때 객체의 시각적 크기가 어떻게 바뀌어야하는지 모호합니다. 특히, 물체가 가까이있을수록 물체가 더 빨리 커지는 것처럼 보입니다. 이는 물체가 멀리있을 때보 다 물체가 가까이있을 때 뷰어가 거리의 절반을 훨씬 더 빨리 커버하기 때문입니다. 또는 달리 표현하자면, 시청자의 속도는 일정하지만 물체와의 거리가 변함에 따라 "거리의 절반"값이 변합니다.


2

실제로 3D 공간에서 작업하고 있지 않기 때문에 스프라이트가 회전하지 않는다고 가정 할 수 있습니다 (회전은 기울이기 등으로 시뮬레이션 할 수 있습니다). 카메라에서.

먼저, 3D 객체가 어떻게 렌더링되는지 이해해야합니다. 카메라가 단일 지점으로 수렴하더라도 객체를 그릴 수있는 화면 역할을하는 보이지 않는 평면이 있습니다. 화면에 대해 알아야 할 것은 카메라와 화면이 얼마나 떨어져 있는지입니다.

다음은 서로 다른 두 거리에서 객체를 카메라에 렌더링하는 방법을 보여주는 다이어그램입니다.

예상대로 물체의 높이는 카메라와의 거리에 따라 다릅니다. 그러나 컬링은 가까운 컬링 평면에서 발생하므로 해당 지점에서 스프라이트의 높이를 계산해야합니다.

일부 기본 삼각 계산은 다음 공식으로 이어집니다.

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

예:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

나는 시작한 v=5다음 모양에 따라 거기에서 조정 하는 것이 좋습니다 . 실시간으로 변경 사항을 볼 수 있도록 바이올린을 함께 던질 수 있습니다.

TL; DR

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

편집하다: z 축을 따라 움직일 때 (대부분의 3D 게임, 슈팅 게임 등) 투시도를 원한다고 가정합니다. 거리를 기준으로 객체 크기를 계산하는 수학은 프레임의 위치에 따라 달라집니다. 주변 시력과 유사합니다. 대신, 나는 직교 적 인 관점 인 마리오, 앵그리 버드, 슈퍼 스매쉬 브라더스 등의 수학으로 시도해 볼 것입니다. 나는 당신이 달성하려고하는 외모와 느낌을 모르지만 그것이 실제처럼 보인다면 플레이어는 결코 알지 못할 것입니다!

데모!


예, 저는 실제로 직교 뷰를 목표로하고 있습니다. 내가 현재 얻은 영감을 "빌려 오는"게임은 Rayman Origins입니다. 게임의 일부 섹션에서 꽃을 뛸 수 있으며 다른 깊이의 다른 레이어에서 바운스됩니다. 그런 다음 카메라가 해당 깊이에 해당하는 확대 또는 축소됩니다. Axamples는 이 비디오 에서 4:50 및 5:00에 볼 수 있습니다 .
Berry

또한, 좋은 답변입니다! 그러나 "2 배, 2 배 더 큰"규칙이 적용된다는 확인만으로 충분했기 때문에 Blue의 답변을 최고로 선택했습니다.
Berry

게임에 감사하고 행운을 빕니다! 그러나 모든 것이 카메라에 매우 가까이 있으면 "두 배 가까이, 두 배로 크게"잘 작동한다는 것을 다른 사람들에게 분명히 밝히고 싶습니다. 사물이 멀어 질수록 인식되는 크기 변화가 줄어 듭니다. 예를 들어 엄지 손가락을 가까이 본 다음 팔을 뻗어 봅니다. 엄지 손가락의 크기가 크게 작아 보입니다. 그 후, 멀리있는 것을보십시오. 한 발 뒤로 이동합니다 (팔 길이와 거의 동일). 크기가 거의 변하지 않은 것에 주목하십시오. 게임의 시야가 긴 경우 약간의 수학을 사용하면 먼 길을갑니다.
Jim Buck

편집 : 이전 의견에서 실수를했습니다. 항목이 카메라와의 거리와 관련하여 서로 매우 가깝게 유지되는 경우 "두 번, 두 번 크게"가 정확합니다.
Jim Buck

다음은 간단한 데모입니다 . 마우스를 사용하여 이동하고 스크롤 휠을 사용하여 깊이를 변경하십시오.
Jim Buck

0

이것은 다루지 않았고 이것이 도움이 될 것이라고 생각했습니다. 거리의 절반이되면 X와 Y 치수의 크기를 두 배로 늘리면 스프라이트의 총 면적 이 4 배가 됩니다 . 이 때문입니다:

Area = X * Y

확대 후 :

NewArea = (x*2) * (y*2)

확대 / 축소 효과가 빠르게 발생하거나 너무 강렬하다는 인상을 줄 수 있습니다. 위의 수식에서 2를 대신 1.5 또는 1.33과 같은 부동 소수점 값으로 변경하여 계수를 조정할 수 있습니다.

또는 내가 한 일은 카메라 깊이 (거리)를 카메라 변환 (X 및 Y)과 함께 바이트 값으로 타일에 저장 한 다음 투사 타일 크기를 계산하는 것입니다.

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

참고 CameraZ가 엄격 1-255 사이 여야하고, 그 제한은 이익 또는 미래에 당신에게 독이 될 수있다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.