2D 보기에 3D 객체 투영

Flash Player 10 이상, Adobe AIR 1.5 이상

flash.geom 패키지의 PerspectiveProjection 클래스를 사용하면 3D 공간에서 표시 객체를 이동할 때 기본적인 원근을 손쉽게 적용할 수 있습니다.

3D 공간에 대한 원근 투영을 명시적으로 만들지 않을 경우 3D 엔진에서는 루트에 있으며 모든 자식 객체에 전달되는 기본 PerspectiveProjection 객체를 사용합니다.

다음은 PerspectiveProjection 객체의 3D 공간 표시 방식을 정의하는 세 가지 속성입니다.

  • fieldOfView

  • projectionCenter

  • focalLength

fieldOfView focalLength 는 상호 종속적이므로 한 쪽 값을 수정하면 다른 쪽 값도 자동으로 수정됩니다.

fieldOfView 값이 주어진 경우 focalLength 를 계산하는 데 사용되는 수식은 다음과 같습니다.

focalLength = stageWidth/2 * (cos(fieldOfView/2) / sin(fieldOfView/2)

일반적으로 fieldOfView 속성은 명시적으로 수정합니다.

시야

PerspectiveProjection 클래스의 fieldOfView 속성을 조작하면 보는 사람 쪽을 향하는 3D 표시 객체는 크게 나타나고 보는 사람으로부터 벗어나는 객체는 작게 나타나도록 할 수 있습니다.

fieldOfView 속성은 원근 투영의 강도를 결정하는 각도를 0도에서 180도 사이로 지정합니다. 값이 클수록 z축을 따라 이동하는 표시 객체가 더 왜곡되어 나타납니다. fieldOfView 값이 작으면 크기가 매우 작게 조절되며 객체가 공간에서 뒤쪽으로 약간만 이동한 것처럼 나타납니다. fieldOfView 값이 크면 왜곡이 커지고 더 많이 이동한 것처럼 나타납니다. 최대값인 179.9999...도를 사용하면 카메라 어안 렌즈 효과가 최대로 나타납니다. fieldOfView 의 최대값은 179.9999...이고 최소값은 0.00001...입니다. 정확히 0과 180은 잘못된 값입니다.

투영 중심

projectionCenter 속성은 원근 투영의 소실점을 나타냅니다. 소실점은 스테이지의 왼쪽 위 모서리에 있는 기본 등록 포인트(0,0)에 대한 오프셋으로 적용됩니다.

객체는 보는 사람으로부터 멀리 이동함에 따라 소실점을 향해 기울어지다가 마지막에는 소실됩니다. 즉, 무한히 긴 구멍을 상상하면 됩니다. 이 구멍을 내려다 보면 벽의 가장자리가 구멍 아래의 깊은 곳에서 소실점에 수렴됩니다.

소실점이 스테이지의 중심에 있으면 이 구멍은 중심점 쪽으로 사라집니다. projectionCenter 속성의 기본값은 스테이지의 중심입니다. 예를 들어 요소가 스테이지의 왼쪽에 나타나고 3D 공간이 오른쪽에 나타나도록 하려면 projectionCenter 를 스테이지의 오른쪽에 있는 한 점으로 설정하여 해당 점을 3D 보기 공간의 소실점으로 만듭니다.

초점 거리

focalLength 속성은 z축 상에서 시점의 원점(0,0,0)과 표시 객체가 있는 위치 사이의 거리를 나타냅니다.

초점 거리를 길게 설정하면 망원 렌즈로 볼 때처럼 시야가 좁고 객체 간의 거리가 압축되어 나타납니다. 초점 거리를 짧게 설정하면 광각 렌즈로 볼 때처럼 시야가 넓고 왜곡이 심하게 나타납니다. 초점 거리를 중간 정도로 설정하면 사람의 눈으로 볼 때와 비슷하게 나타납니다.

일반적으로 focalLength 는 표시 객체가 이동할 때 원근 변형 과정에서 동적으로 다시 계산되지만 사용자가 이를 명시적으로 설정할 수도 있습니다.

기본 원근 투영 값

루트에 만들어진 기본 PerspectiveProjection 객체의 각 속성 값은 다음과 같습니다.

  • fieldOfView: 55

  • perspectiveCenter: stagewidth/2, stageHeight/2

  • focalLength: stageWidth/ 2 * ( cos(fieldOfView/2) / sin(fieldOfView/2) )

이러한 값은 사용자가 PerspectiveProjection 객체를 만들지 않을 경우에 사용되는 값입니다.

projectionCenter fieldOfView 를 직접 수정하려는 경우 PerspectiveProjection 객체를 직접 인스턴스화할 수 있습니다. 이 경우 새로 만든 객체는 기본 스테이지 크기인 500 x 500에서 다음과 같은 기본값을 가집니다.

  • fieldOfView: 55

  • perspectiveCenter: 250,250

  • focalLength: 480.24554443359375