기본 콘텐츠로 건너뛰기

라벨이 3D인 게시물 표시

Ellipse의 Start, End Point 구하기

포맷마다 프리미티브를 정의하는 것이 달라 데이터 교환을 위해서 프리미티브 변환을 해줘야 합니다. Ellipse는 아래와 같이 정의할 수 있습니다.($\alpha$=시작 각도, $\beta$=회전 각도) 위 그림에서 Ellipse상의 점 $A$는 아래 식으로 구할 수 있습니다. $x^\prime = a*cos(\theta)\\y^\prime = b*sin(\theta)$ 위 식은 2D일때의 식이고 그럼 3D일때는 어떻게 식을 구해야 할까요? $a, b$ 는 각각  $\vec{U}$축, $\vec{V}$축상의 거리이기 때문에 위 식은 아래 식으로 변환할 수 있습니다. $x^\prime = a*\vec{U}*cos(\theta)\\y^\prime = b*\vec{V}*sin(\theta)$ 위 식이 Ellipse의 일반식이 됩니다. $\vec{U}, \vec{V}$에 축의 벡터를 입력하면 원하는 좌표를 구할 수 있습니다. 예를 들어 $\vec{U}$에 $\vec{X}([1, 0, 0])$을 $\vec{V}$에 $\vec{Y}([0,1,0])$을 대입하면 아래와 같습니다. $$x^\prime = a*[1_x,0_y,0_z]*cos(\theta)\\y^\prime = b*[0_x,1_y,0_z]*sin(\theta)$$ $\vec{X}$축의 $y,z$ 요소는 0이고, $\vec{Y}$축의 $x,z$ 요소는 0이기 때문에 이것을 풀어보면 첫번째 식과 같게 됩니다. $\vec{U}$, $\vec{V}$축이 임의의 3D 축이라고 가정해보면 $$x^\prime = a*[u_x,u_y,u_z]*cos(\theta)\\y^\prime = b*[v_x,v_y,v_z]*sin(\theta)$$ 월드 좌표 $(x,y,z)$는 아래 식으로 구할 수 있습니다. $$x = a*u_x*cos(\theta)+b*v_x*sin(\theta)\\y = a*u_y*cos(\theta)+b*v_y*sin(\theta)\\z = a*u_z*cos(\theta)+b*v_z*sin(\theta)$$...

[3D] 벡터 오른손 법칙(Right-Hand Rule)

 두 벡터($\vec{A}, \vec{B}$)의 외적은 외적의 크기와 방향을 가지는 또 하나의 벡터로 표현할 수 있습니다. 기하학적으로 보면 두 벡터가 이루는 평면에 수직인 벡터(법선 벡터)가 됩니다. 평면에 수직인 벡터는 평면의 위쪽 혹은 아래쪽으로 2개의 방향성을 가집니다. 우리가 배워온 수학이나 OpenGL에서는 오른손 법칙을 통하여 법선 벡터의 방향성을 결정합니다. 오른손을 악수하듯이 펴서 첫번째 벡터 방향으로 놓습니다. 그리고 손가락을 두번째 벡터가 놓인 방향으로 굽힙니다.(손등 방향으로 꺽이는 분은 없겠죠?) 이때 엄지 손가락의 방향이 법선 벡터의 방향입니다. 이렇게 몇번 하다보면 두 벡터가 놓인 위치에 따라 방향이 바뀌는 것을 확인할 수 있습니다. 참고로 Unity나 Direct3D는 왼손 법칙을 이용하여 외적의 방향을 결정한다고 합니다.

3D 모델링 상의 한 점과 2D 도면(뷰)과의 상호 변환

 우선 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 좌표를 뷰 회전 각도로 회전시킨...