우선 3D 모델링 상의 한 점에서 2D 도면(뷰)으로의 변환을 살펴봅시다.
일반적으로 3D 모델링을 바라보는 방향에 따라서 TOP , BOTTOM , LEFT , RIGHT , FRONT , BACK 이렇게 6개의 뷰를 생성할 수 있습니다. 아래는 각각의 뷰 변환행렬입니다.
$$\begin{eqnarray}\text{Bottom View} &=& \begin{bmatrix}1&0&0\\0&-1&0\\0&0&1\end{bmatrix} \\ \text{Top View} &=& \begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix} \\ \text{Right View} &=& \begin{bmatrix}1&0&0\\0&0&1\\1&0&0\end{bmatrix} \\ \text{Left View} &=& \begin{bmatrix}0&-1&0\\0&0&1\\-1&0&0\end{bmatrix} \end{eqnarray}$$
그리고 3D 모델링에 스케일과 회전을 적용한 후에 3D 모델의 중점을 도면의 중점에 맞추면 도면으로의 변환이 완성됩니다.
- 변환할 점에서 모델의 중점을 뺀다.(모델의 중점을 (0 , 0 , 0)좌표로 두는 효과)
$tmp=pt-\text{model center pt}$ - 뷰 변환 행렬을 통해 2D로 변환시킨다.
$tmp^\text{'}= \begin{bmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{bmatrix}*tmp$ - 변환된 2D 좌표를 뷰 회전 각도로 회전시킨다.
$tmp^\text{''}= \begin{bmatrix}cos\theta&-sin\theta\\sin\theta&cos\theta\end{bmatrix}*tmp^\text{'}$ - 뷰 스케일로 곱한다.
$tmp^\text{'''}=tmp^\text{''}*scale$ - 뷰의 중점으로 이동시킨다.
$pt^{\text{'}} = tmp^{\text{'''}} + \text{view_center_pt}$
$pt^\text{'}$가 2D로 변환된 결과 값입니다.
2D 도면(뷰)에서 3D 모델링 상의 한 점으로의 변환을 살펴봅시다.
이 변환은 3D 모델링 상에서 2D 도면(뷰)으로의 변환의 역 변환이 됩니다.
- 변환할 점에서 뷰의 중점을 뺀다.(뷰의 중점을 (0 , 0 , 0)좌표로 두는 효과)
- 뷰 스케일로 나눈다.
- 좌표를 뷰 회전 각도로 역회전시킨다.(거꾸로 회전한다는 말)
- 역 뷰 변환 행렬을 통해 모델상의 좌표로 변환시킨다.(뷰 변환 행렬의 역행렬을 구해야 한다.)
- 모델의 중점으로 이동시킨다.
PDS 뷰의 Type(Top,Bottom,Left,Right,Front,Back)알아내기
PDS뷰는 회전 행렬정보를 가지고 있는데 이 회전 행렬을 가지고 뷰의 Type을 얻어낼 수가 있습니다. 여기서 행렬은 두 개의 행렬의 곱으로 표현할수 있습니다.
$$M = R\times T$$
R은 Z축에 대한 회전 행렬입니다.
따라서 M과 T의 맨 마지막 줄은 같은 값을 가지게 됩니다.
이것을 가지고 Left,Right,Front,Back뷰를 찾아낼 수가 있습니다.
아쉽게도 Top,Bottom 뷰는 회전 행렬의 맨 마지막 줄이 같은 값을 가지고 있습니다.
Top,Bottom의 구별은 (0,0) , (1,1)의 부호가 서로 같은지 여부로 판단할수 있습니다.
즉 같은 부호를 가지면 Top이고 그렇지 않으면 Bottom이 됩니다.
댓글
댓글 쓰기