상세 컨텐츠

본문 제목

큐브를 어떤 평면으로 분할하는 과정

Maya_Plugin_Development /FickleCube

by hwano 2014. 2. 21. 12:21

본문

 

 

 

 

 

큐브의 한쪽 면과 locator의 매트릭스로 지정한 평면과의 교선을 구한다.

( 매트릭스에서 평면의 방정식을 뽑아내야겠지? )

 

그리고 그 교선과 큐브의 edge하나와 교점을 구한다?

 

 

 

------

 

 

sliceMatrix에 locator의 matrix를 연결해서

locator의 움직임에 따라 움직이는 평면을 구성해보자.

 

 

 

------

 

 

slice할 전체 큐브를 만들어 보자

 

 

-----

 

 

이제 두개로 slice 해보자.

slice 플랜의 평면 방정식을 구하고

메인큐브 각 edge 12개와 각각 플랜과 교차하는지 검사한다.

 

인터넷에서 교차판정에 관한 수학공식이 나와있는 글은 많은데

공식을 봐도 이해가 안된다.... ㅜㅜ

 

몇개 찾아보다가 그냥 대충 상식선에서 판단할 수 있을거 같다.

 

 

 

제일 밑에 라인이 slicePlane이라고 가정하고

선분 = AB가 메인큐브의 한쪽 모서리라고 가정한다.

 

 

 

이때 선분 AB와 slicePlane과의 관계는 크게 봤을 때 딱 세가지만 나온다.

Plane이 선분 AB와 만나지 않은경우

Plane이 A나 B중 하나의 point와 만나는 경우

Plane이 선분 AB 안쪽에 들어온 경우

 

자세히 들어가면 plane이 A아래로 벗어난 거와 B위로 벗어난 거를 따로

계산해야 될거 같은데 우선 이렇게만 계산해 보자.

 

1. A, B에서 plane에 직교하는 거리값 a, b를 뽑고 그 방향과 동일한 방향으로

B에서 A까지의 거리값 c를 뽑는다.

 

2. a, b 중 하나가 c와 동일 하다면 plane은 점 A, B 중 하나에 있다면 얘기 일꺼니 pass

   a + b > c 이라면 교차하지 않으니 pass

   a + b < 이라면 교차한다는 얘기니까 그 교차점을 구해야 한다.

 

 

교차점을 구하는 공식은

 

http://effortman.tistory.com/48

여기 있는 걸 가져다 쓰자

 

 

 

-----

 

 

직선과 평면과의 교점을 구하는 과정을 마야상에서

노드로 구현하면서 설명해 놓은게 있다.

http://vimeo.com/59896276

 

 

이론 정리

위치가 두개 있다. p0 와 pv0

p0는 원점 개념의 위치

pv0는 원점에서 plane쪽으로 향하는 벡터를 정하기 위한 위치

 

두 위치를 연결한

벡터 v0 = ( pv0 - p0 )가 있다.    // 자꾸 헷갈리는데 ( 바라본 위치-시작위치 )이다.

 

 

평면에다가 임의의 점 하나를 찍고 pi라로 해보자 ( i는 intersection의 뜻으로 )

 

그러면 pi = p0 + v0 * d가 된다. 당연하겠지?   ------------------------  1번

step_01.mb

 

 

 

평면의 다른 위치에 pn이라는 점을 설정하고 평면의

법선벡터를 벡터n라고 해보자  (법선 normal이라는 뜻으로 n )

 

벡터( pi -pn ) ㆍ n = 0이 된다.                     // ㆍ는 내적 -----------2번

 

1번 식을 아래 2번 식의 pi에 쏙 대입하면

( p0 + v0 *d  - pn ) ㆍ n = 0 요래 될꺼고

ㆍ n을 괄호안에 각 항에 넣으면

p0ㆍ n +  v0*dㆍ n  -pnㆍ n = 0

여기서 d값을 얻어보면

v0*dㆍ n = pnㆍ n - p0ㆍ n

v0*dㆍ n = ( pn - p0 )ㆍ n

 

d = (( pn - p0 )ㆍ n) / v0ㆍ n   -------------------------------------3번

이렇게 정리 된다.

 

위 식에서 v0ㆍ n 부분은 0이 되어버리면

 

그림처럼 아래 평면과 v0가 평행해버리게 되니까

if문을 하나 달아서 ( v0ㆍ n ) != 0 일 경우만

작동하도록 해야되고 이때 3번을 1번에 대입해서

pi를 구할 수 있다.

 

 

step_03.mb

 

 

-----

 

 

이 것을 내 작업에 적용 시킬 수 있나?

직선과 평면이 유한 직선이나 유한 평면을 기초로 한게 아니지만

 

이미 교차 판정까지는 끝내 놓았으니까

서로 만났을 경우에만 적용하면 되지 않을까.

 

 

 

 

-----

 

 

 

갑자기 드는 생각이 알고리즘 짜는게 잘못된 방향이라는 생각이 든다.

슬라이스 plane이 기준이 아니라 슬라이스된 큐브들의

중심점을 기준으로 짜야 되지 않을까?

 

 

------

 

 

큐브 넘버링 기준

 

 

------

 

생각보다 시간이 많이 걸려서 큰일났다.

메모  --   현재 시계방향대로 폴리곤 vertexArray를 찍어주는 함수를 짜야된다.

 

향후 남은 게 그렇게 만들어진 폴리곤을 slice평면에 맞게 나누어서 큐브들을

분류하는 것.

 

그렇게 큐브들을 나눠서 이제 애니메이션을 주면 되는데,,    짬짬히 하려니 너무 오래걸리네

 

 

-------

 

파란색이 guideVector

붉은색이 crossVector

 

 

------

 

 

근 이틀을 통으로 날려먹었지만

어쨌든 되긴되네.. 1차 완성

 

 

 

관련글 더보기