2D 보기에 3D 객체 투영

Flash Player 10 이상, Adobe AIR 1.5 이상

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

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

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

  • fieldOfView

  • projectionCenter

  • focalLength

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

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 객체를 만들지 않을 경우에 사용되는 값입니다.

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

  • fieldOfView: 55

  • perspectiveCenter: 250,250

  • focalLength: 480.24554443359375