[GPG 1 글 2.7] 사원수에 대해... 기본적인 질문입니당...;;

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

쌀밥
Posts: 1058
Joined: 2003-02-02 20:23
Location: THQ Inc.
Contact:

사원수에 대해... 기본적인 질문입니당...;;

Post by 쌀밥 »

사원수에 대해...

오늘 하루 종일 사원수에 대해 공부했습니다.
공부에 사용한 책은
3D 게임 프로그래밍 & 컴퓨터 그래픽을 위한 수학.
GPG 1권, 수학2의 정석 上 등등입니다 :lol:

그런데 아무리 몇번을 읽어봐도
역시 독학으로 하는거라 그런지
(사원수 라는 거를 한번도 배워본적이 없어서...)
잘 감이 잡히질 않습니다.
주변에 여기에 대해 아는 사람도 없고...
참 답답하군요...;;
(그런데 대학교 선형 대수나 공업 수학때도 hypercomplex number 나 헤밀턴 사원수 고리 같은건 다루지 않는데. 다른 분들은 어디서 맨 처음 주워들으셨는지들.. 궁금합니다...)


궁금한 점을 몇가지 정리해 보면 이렇습니다.

----
1. 사원수는 4x4 행렬로 할 수 있는 걸 모두 다 할수 있는가?
2. 없다면, 3x3 행렬로 할 수 있는 건 모두 할 수 있는가?
3. 없다면, 사원수는 '벡터의 회전' 에만 사용하는 물건인가?
4. d3dx8math.h 의 D3DXQUATERNION 를 사용해서
정점 (1,2,3) 을 z 축을 기준으로 30도 회전 시키려하려고 하면 코드가 어떻게 되는가??
----

4번은 제가 짜보면 이렇습니다.

D3DXVECTOR3 VertexOrg( 1,2,3 );
D3DXVECTOR3 VertexDst;
D3DXVECTOR3 axisZ( 0,0,1 );

D3DXQUATERNION qOrg( VertexOrg );
D3DXQUATERNION qRot, qRst;
D3DXQuaternionRotationAxis( &qRot, &axisZ, 30 );

qRst = qOrg * qRot;
VertexDst.x = qRst.x;
VertexDst.y = qRst.y;
VertexDst.z = qRst.z;

위에 처럼 하면 일단 결과는 엉망으로 나오는데.. 그건 둘째 치더라도
쿼터니언과 백터를 곱할수 없으니까
백터를 쿼터니언으로 바꿨다가 결과가 나오면 다시 백터로 옮기는 코딩을 해봤는데요..
이렇게 해도 괜찮은 겁니까?

쿼터니언을 사용한 예제를 구할수가 없어서
도대체 어떤식으로 코딩을 하는지 모르겠습니다. ㅜ.ㅜ


*PS : 기억을 더듬어 보니....
작년 10월쯤에 네이버에서 '사원수' 로 검색했던적이 있습니다.
그리고 그때 부터 pgpstudy.com 을 알게 되었습니다;;;;
사원수가 저랑 꽤 인연이 있는 놈입니다.. 질기게도 절 괴롭히는 놈입니다;;;
I want to live in korea, making programs, but...
http://wrice.egloos.com
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Re: 사원수에 대해... 기본적인 질문입니당...;;

Post by 류광 »

사원수는 회전만 다룹니다. 달리 말하면 3D에서 '임의의 축에 대한 임의의 각도의 회전'을 사원수로 표현하는 게 행렬보다 편하고 효율적이라는 것을 20 세기 들어 컴퓨터 그래픽 공학자들(존 카맥도 한 몫)이 깨닫게 된 것입니다.

나열된 책들을 보니 사원수 연산에 대해 이야기할 필요는 없겠네요...

회전 과제는 크게 두가지인 것 같은데요..

1. 물체가 임의의 방향을 향하게 한다.
2. 현재 방향을 중심으로 물체를 임의의 각도만큼 회전한다.

사실 둘 다 같은 것이지만 사람이 이해하고 구현하기가 어느 쪽이 더 쉬운 가는 과제에 따라 달라지는 것 같습니다. 요, 피치, 롤도 좀 더 이해하기 쉽게 만들기 위한 수단이구요... 어쨌든 2 번 과제들을 자주 만나게 된다면, 사원수라는것을 자연스럽게 이해하게 되지 않을까 싶네요...

두 가지 연습을 추천합니다. 하나는 태양, 지구, 달이 자전, 공전하는 시스템을 보여주는 거(회전과 이동에 대한 개념을 잡기에 아주 좋을 것입니다), 또 하나는 관절이 적어도 둘 인 로보트 팔을 만드는 거..(역기구학을 구현할 필요는 없구요..)
쌀밥
Posts: 1058
Joined: 2003-02-02 20:23
Location: THQ Inc.
Contact:

D3DXQUATERNION 사용법에 대해...

Post by 쌀밥 »

앞에 답변 감사합니다.
역시 회전에만 사용되는 물건이었군요...


그런데 위에 적은
4. d3dx8math.h 의 D3DXQUATERNION 를 사용해서
정점 (1,2,3) 을 z 축을 기준으로 30도 회전 시키려하려고 하면 코드가 어떻게 되는가??
를 계속 생각해 봤는데
이렇게 짜는게
어제보다는 좀 더 정답에 가까운것 같습니다.

Code: Select all

	D3DXVECTOR3	VertexOrg( 1,2,3 );
	D3DXVECTOR3	VertexDst;
	D3DXVECTOR3	axisZ( 0,0,1 );

	D3DXQUATERNION	qOrg( VertexOrg );
	D3DXQUATERNION	qRot, qRst;
	D3DXQuaternionRotationAxis( &qRot, &axisZ, D3DX_PI/3.0f );
	D3DXQuaternionMultiply( &qRst, &qRot, &qOrg );
결과는 이렇게 나옵니다.
qRst.x = 1.86603
qRst.y = 1.23205
qRst.z = 2.59808
qRst.w = -1.50000
제 생각에는
좌표가 (1,2,3) 인 정점을 Z 축을 기준으로 회전시키면
z 값은 그대로 3 으로 유지되어야 할것 같은데
2.6 으로 바뀌어 있습니다.
w 값과 연관이 있는가 생각해 봤는데
그것도 아닌것 같고..

어디가 잘못된건지 좀 알려주세요...
I want to live in korea, making programs, but...
http://wrice.egloos.com
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

D3DX는 잘 모르지만... 일단 켤레 사원수를 안 곱하셨네요(GPG 1 274 참고)

D3DXQuaternionMultiply()의 곱하는 순서도 주의하시구요~

w 값도 직접 점검해 보시길 !
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

참 DX8이죠??

D3DXQUATERNION 생성자에 D3DXVECTOR3를 바로 넣는 게 좀 걸려서 찾아봤더니, D3DXQUATERNION 이 D3DVECTOR3을 FLOAT*으로 간주해서 받아들이는 것 같습니다(D3DVECTOR3의 operator FLOAT*()에 의해서요).

D3DVECTOR3은 FLOAT이 세 개 뿐이므로 D3DXQUATERNION 생성자가 받은 네 번째 값은 쓰레기 값일 가능성이 큽니다. FLOAT 네 개짜리 생성자를 사용하고 마지막에 0을 확실히 넣어야 할 것 같아요.
쌀밥
Posts: 1058
Joined: 2003-02-02 20:23
Location: THQ Inc.
Contact:

Post by 쌀밥 »

아. 그 별표(*) 가 켤례 사원수(conjugate quaternion) 라는걸 깜박 했습니다..
코드를 다시 짜봤습니다.

Code: Select all

	D3DXVECTOR3		vOrg( 1.0f, 2.0f, 3.0f );
	D3DXVECTOR3		axisZ( 0.0f, 0.0f, 1.0f );
	FLOAT			fAngle = D3DX_PI / 6.0f;	// 30'

	D3DXQUATERNION	qOrg( vOrg.x, vOrg.y, vOrg.z, 0.0f );
	D3DXQUATERNION	qRot, qRotConj;
	D3DXQuaternionRotationAxis( &qRot, &axisZ, 2.0f * fAngle );
	D3DXQuaternionConjugate( &qRotConj, &qRot );
	D3DXQUATERNION	qRst = qRot * qOrg * qRotConj;

	D3DXVECTOR3		vRst( qRst.x, qRst.y, qRst.z );
속도를 좀 더 높이려면 임시 변수들(위에서는 qRot, qRotConj, qOr, qRst) 을 static 으로 하면 되겠습니다.
이번에는 결과가 다음과 같이 정상적으로 나옵니다.
qRst.x = 2.23205;
qRst.y = 0.133975;
qRst.z = 3.00000;
qRst.w = 0.00000;
쿼터니언을 사용한 예제 소스들을 좀 더 보고 싶은데
아무리 뒤져도 없습니다. 없어....;;

아주 시원한건 아니지만
이쯤 하고 보니 사원수를 대충 이해한것 같습니다.
나중에 행렬과 사원수를 사용한 회전에 대한 속도 차이를 체크하는 프로그램을 만들어서 눈으로 속도 차이를 확인해 봐야겠습니다....
I want to live in korea, making programs, but...
http://wrice.egloos.com
unicon7
Posts: 59
Joined: 2002-09-19 17:46

음..틀리게 나오는거 같습니다. --;

Post by unicon7 »

음..저도 쿼터니언을 써서 이런 함수를 만들었는데 회전이 반대로 먹습니다.

DX는 왼손좌표계라서 양의 회전은 시계방향으로 먹어야 하는데 님도 그렇고

저도 그렇고 반대로 정점이 회전되고 있는거 같습니다.

결과가 틀린것 같습니다.
지정환
Posts: 114
Joined: 2002-11-20 11:51

사원수는 반대 인걸로 압니다.

Post by 지정환 »

어느 책에서 봤더라...
암튼 사원수는 기존의 월드와는 반대 인 걸로...
-만족할 때 스스로 낮추어라-
[Vladimir yazmov]
쌀밥
Posts: 1058
Joined: 2003-02-02 20:23
Location: THQ Inc.
Contact:

Re: 음..틀리게 나오는거 같습니다. --;

Post by 쌀밥 »

unicon7 wrote:음..저도 쿼터니언을 써서 이런 함수를 만들었는데 회전이 반대로 먹습니다.
DX는 왼손좌표계라서 양의 회전은 시계방향으로 먹어야 하는데 님도 그렇고
저도 그렇고 반대로 정점이 회전되고 있는거 같습니다.
결과가 틀린것 같습니다.
양의 회전이 DX 에서 시계 방향이 아니고 반시계 방향이라고 하는군요...
아래는 MSDN 의 D3DQUATERNION 내용중 일부입니다.
Remarks
Quaternions add a fourth element to the [x, y, z] values that define a vector, resulting in arbitrary 4-D vectors. However, the following illustrates how each element of a unit quaternion relates to an axis-angle rotation (where q represents a unit quaternion (x, y, z, w), axis is normalized, and theta is the desired <B>CCW</b> rotation about the axis):

q.x = Sin(theta / 2) * axis.x
q.y = Sin(theta / 2) * axis.y
q.z = Sin(theta / 2) * axis.z
q.w = Cos(theta / 2)
I want to live in korea, making programs, but...
http://wrice.egloos.com
쌀밥
Posts: 1058
Joined: 2003-02-02 20:23
Location: THQ Inc.
Contact:

Post by 쌀밥 »

근데, 갑자기 헷깔리기 시작하는데요...
CCW 가 반시계 방향을 말하는건데.....

이게 좌표계가 왼손 좌표계이냐 오른손 좌표계이냐에 따라 다른 방향을 의미 하는 건가요?
그게 아니면,
CCW 는 좌표계에 관계없이 항상 같은 방향인가요?

제가 지금 기억하기로는 CCW 라고 하면
오른손 엄지 손가락을 해당 벡터가 가리키는 방향으로 향하고
나머지 손가락들이 감싸는 방향의
반대 방향이 CCW 라고 기억하는데요...
이상하게도, 다른분들의 글을 읽어보면 이거랑 반대로 말씀하시는것 같은데;;;

위에 제가 2월 18일에 올린글에 보면
양의 값으로 회전 시켰는데
제가 말한 방식으로하면 시계 방향으로 돌았습니다.
MSDN 에 보면 이게 반시계 방향으로 돌거라고 나와있는데....

그럼 혹시 DX 가 왼손 좌표계를 사용하는거기 때문에
왼손 좌표계에서는
왼손 엄지 손가락으로 백터의 방향을 가리키고
나머지 손가락들이 가리키는 방향이 시계 방향이 되는건가요?
I want to live in korea, making programs, but...
http://wrice.egloos.com
ㅡㅡ;

쿼터니온의 용도

Post by ㅡㅡ; »

----
1. 사원수는 4x4 행렬로 할 수 있는 걸 모두 다 할수 있는가?
2. 없다면, 3x3 행렬로 할 수 있는 건 모두 할 수 있는가?
3. 없다면, 사원수는 '벡터의 회전' 에만 사용하는 물건인가?
4. d3dx8math.h 의 D3DXQUATERNION 를 사용해서
정점 (1,2,3) 을 z 축을 기준으로 30도 회전 시키려하려고 하면 코드가 어떻게 되는가??
----


벡터의 연속된 회전시 행렬의 연산보다 쉬운 단순한 연산으로 결과가 나와서 사용하는 겁니다.
매트릭스로 할 수 있는 일을 모두 다 할 수 있다는 질문은 수학에서 아이소 모피즘 인가 묻는거 같은데, 4원소를 가진 쿼터니온과 16개 원소를 가진 4x4가 같을리가 없겠죠.
보간에도 사용됩니다. 벡터의 방향이 변했을 때 그 사이의 보간을 위해서도 사용할 수 있습니다. 다른 방법의 보간 보다 계산이 몇차례의 삼각함수 계산으로 부드러운 보간을 할 수 있습니다.
Guest

ccw -> counterclockwise

Post by Guest »

counterclockwise [k&agrave;untklkw&agrave;iz | -klk-] a., ad. 시계 바늘 회전과 반대의[로], 왼쪽으로 도는[돌게] ((★ 《영》에서는 anti-clockwise쪽이 일반적))
a ~ rotation 좌회전
Turn the lid ~. 뚜껑을 시계 바늘 회전 반대 방향으로 돌려라

ccw는 cw의 반대개념...
clockwise [klkw&agrave;iz | klk-] ad., a. 오른쪽[시계 방향]으로 돌아[도는](opp. counterclockwise)

출처 : 야후 영한사전

머 이미 찾으셨겠지만 이 thread중에 없어서 혹시나 이후에 이 글들을 보실분이 있으실까봐 ^^;
비회원

와.. 많은 공부 되었어요.

Post by 비회원 »

:o
저 분이 지식을 습득하는 과정이 저에게도 그냥 적용된듯.

프로그래밍은 아직은 잘 모르지만, 다른 부분은 거의 이해가 가네요. ^^
Post Reply