기본 콘텐츠로 건너뛰기

글

라벨이 컴퓨터 그래픽스인 게시물 표시

[2D]두 직선의 교점 구하기

  2D상의 A,B를 지나는 직선과 C,D를 지나는 직선의 교점을 구하는 방정식을 구해보도록 합시다. $$\begin{eqnarray} l_1&=A+(B-A)\times t_1 \\ l_2&=C+(D-C)\times t_2 \\ A+(B-A)\times t_1 &= C+(D-C)\times t_2\end{eqnarray}$$ 두 직선은 교점은 위의 방정식을 통하여 구할 수 있습니다. 이 방정식을 풀어보도록 합시다. 위 방정식은 2개의 변수를 가지고 있으므로 2개의 식이 있어야만 방정식을 풀수 있습니다. 따라서 이 방정식을 매개변수 $x,y$에 대해서 풀어보면, $$\begin{eqnarray} A_x+(B_x-A_x)\times t_1 &= C_x+(D_x-C_x)\times t_2 \\ A_y+(B_y-A_y)\times t_1 &= C_y+(D_y-C_y)\times t_2\end{eqnarray}$$ (4)번 식에서 $t_2$를 구해 (5)번 식에 대입하면, $$\begin{eqnarray} A_y+(B_y-A_y)\times t_1 &=& C_y+(D_y-C_y)\times \frac{(A_x-C_x)+(B_x-A_x)\times t_1}{(D_x-C_x)} \\ (A_y-C_y)*(D_x-C_x) &=& (D_y-C_y)*(A_x-C_x)+((B_x-A_x)*(D_y-C_y)-(B_y-A_y)*(D_x-C_x))\times t_1 \\ t_1 &=& \frac{(A_y-C_y)*(D_x-C_x)-(A_x-C_x)*(D_y-C_y)}{(B_x-A_x)*(D_y-C_y)-(B_y-A_y)*(D_x-C_x)}\end{eqnarray}$$ 이렇게 해서 $t_1$를 구했습니다. 만일 분모가 0이 되면 $t_1$을 구할 수가 없게 되고 따라서 교차점도 구할 수 없습니다. (두 직선이 평행할 경우) $$(B_x-A_x)*(D_y-C_y)-(B_y-A_y)*(D_x-C_x)=0$$...

Bspline Knot의 수정

앞에서 B- spline곡선은 여러 개의 부분 곡선들로 이루어져 있고, 각 부분 곡선들은 매듭 구간에서 정의되고 있다고 했습니다. 그래서 부분 곡선들이 정의되어 있는 이 매듭 구간을 수정을 하면 곡선의 형태도 바뀌게 됩니다. 이 매듭 구간을 결정하는 knot을 수정함으로써 곡선의 형태를 변형시킬 수 있습니다. 하지만 knot을 수정해서 곡선의 형태를 바꾸는 것은 그다지 바람직한 방법이 아닌 것 같습니다. knot을 수정해서 변형되는 곡선의 형태를 미리 예측하기가 힘들기 때문입니다. knot의 추가 knot의 추가는  기존의 곡선의 형태를 변형시키지 않고  새로운 knot을 매듭 벡터에 추가시키는 것입니다. knot이 하나 추가되면 m이 증가되므로 $m=n+p+1$의 식에서 n이나 p가 증가되어야 합니다. p가 증가되면 하나의 부분 곡선을 이루는데 필요한 basis function의 개수가 증가되므로 p가 증가되기 전보다 곡선의 부분적인 편집 기능이 떨어지게 됩니다. 그래서 이것은 고려하지 않고 n을 증가시킵니다. 즉 새로운 제어점을 추가시킨다는 말입니다. 다시 정리하면 n+1개의 제어점 $P_0,P_1,...,P_{n-1},P_n$와 그것과 연관된 양의 값인 $W_i$, $m+1$개의 매듭을 가진 매듭 벡터 $U=\{u_0,u_1,...,u_{m-1},u_m\}$, 차수 p를 가진 B-spline 곡선에 곡선의 형태는 변형시키지 않고 새로운 매듭을 추가시키는 것입니다. 추가시킬 새로운 매듭  u 가 매듭 구간 $[u_k,u_{k-1})$에 속한다고 가정하면, 이 매듭 구간에서 정의되는 곡선은 제어점 $P_{k-p},P_{k-p+1},...,P_{k-1},P_k$에 의해서 형성됩니다. 우리는 새로운 제어점을 찾아야 하기 때문에 $P_{k-p},P_{k-p+1}$상의 $Q_{k-p+1}, P_{k-p+1},P_{k-p+2}$상의 $Q_{k-p+2},…,P_{k-1},P_k$상의 $Q_k$을 찾아야 합...

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

임의의 축에 대한 회전 #2

임의의 축에 대한 회전에 대한 2번째입니다. 첫번째 보다 간단합니다. 그림에서처럼 임의의 축 $\vec{n}$에 대해서 $\vec{r}$이 가리키는 점을 $\theta$만큼 회전을 시키는 경우를 생각해봅시다. $\vec{r}$은 $\vec{n}$ 수직인 성분($\vec{r_+}$)과 평행한 성분($\vec{r_{//}}$)으로 나눌 수 있습니다. 평행한 성분은 $\vec{r}$에 대해서 회전을 한 뒤에도 그 값이 변하지 않습니다. $$ r_{//} = \big( \vec{n}\cdot\vec{r} \big) \vec{n} \\ r_+ = \vec{r} - \big( \vec{r}\cdot\vec{n} \big) \vec{n} $$ $\vec{r_+}$에 수직이고 또한 $\vec{r_{//}}$에 수직인 벡터를 $\vec{V}$라 두고, $\vec{r_+}$의 $\vec{n}$에 대한 회전은, $$ \vec{V} = \vec{n}\times\vec{r_+} = \vec{n}\times\vec{r} \\ R_{r_+} = cos(\theta)r_+ + sin(\theta)\vec{V} $$ 이 됩니다. ($r_+$를 X축, $\vec{V}$를 Y축으로 생각하시면 됩니다.) 이제 $\vec{r}$의 $\vec{n}$에 대한 회전은, $$ \begin{aligned} R_{r_+} &= R_{r_{//}} + R_{r_+} \\ &= (\vec{n}\cdot\vec{r})\vec{n} + cos(\theta)r_+ + sin(\theta)\vec{V} \\ &= cos(\theta)\vec{r} + \big( 1 - cos(\theta)\big) \vec{n}(\vec{n}\cdot\vec{r}) + sin(\theta)\vec{n}\times\vec{r} \end{aligned}$$ 이 됩니다. 단, 여기서 $\vec{n}$은 단위 벡터입니다.