블로그 이미지
이태원에서 사는 다섯식구의 무직 가장. 흰둥에미

카테고리

분류 전체보기 (184)
Itaewon (2)
ryu's?? (1)
20121210이전 (20)
20130827이전 (147)
soo'study (13)
Total35,270
Today14
Yesterday4

'태그를 입력해 주세요.'에 해당되는 글 3건

  1. 2013.04.03 짐벌락과 그 해결.
  2. 2013.02.22 컴포넌트 패턴
  3. 2013.02.16 QueryPerformanceCounter

짐벌락.

오일러의 공식을 이용해 회전 변환이 이루어질 시, x, y, z 세 축에 대해 각각의 회전을 조합하게 된다.

따라서 연산 순서에 따라 한 축의 90도 회전에 의해 두 축이 겹쳐, 한 축의 자유도를 잃게 됨(즉 겹친 두축의 회전이 동일하게 됨)

(여기서 축이란 회전 축을 의미)

수학적으로는 아무 문제 없는 결과이지만, 3차원상에서의 좌표변환에 문제가 생김.


해결법.

1. 방법으로서는 가장 손쉬운 쿼터니언(사원수)을 사용하면 됨.(물론 수학적 이해나, 실제 증명, 계산은 골 때림)

FLOAT                        fAngleX;

FLOAT                        fAngleY;

FLOAT                        fAngleZ;

D3DXMATRIXA16          matRot;

D3DXQUATERNION       qtRot;

D3DXQuaternionRotationYawPitchRoll(&qtRot, fAngleY, fAngleX, fAngleZ);

D3DXMatrixRotationQuaternion(&matRot,&qtRot);

SetTransform(D3DTS_WORLD, &matRot);


2. 또는 각 오브젝트가 스스로 x, y, z의 베이스 벡터를 지니고, 회전에 따라 베이스 벡터를 갱신해주는 방법이 있음.

Yaw가 변경시, Z축의 벡터를 회전 시키고, Z와 변하지 않는 Y축의 외적을 이용해 X축을 새로 구해줌.

Pitch 변경시, Z축의 벡터를 회전 시키고, Z와 변하지 않는 X축의 외적을 이용해 Y축을 새로 구해줌.

Roll 변경시, X축의 벡터를 회전 시키고, X와 변하지 않는 Z축의 외적을 이용해 Y축을 새로 구해줌.

(회전의 기준이 되는 축은 변경되지 않으므로, 변경될 두 축 중 하나만 회전에 의한 값을 구하고, 다른 한 축은 외적을 이용해 구함,

 두 축 모두 회전을 이용해 구하다 보면, 오차가 누적되어 두 축의 각이 PI/2가 아니게 됨)


단, 1번은 월드 좌표 축 기준으로 회전한 각을 적용하고,

     2번은 현재 베이스 벡터를 기준으로 회전한 각이 적용되게 구현하면 됨.?? 말이 어렵다.. 해보면 알꺼임.


그 외에도 피하는 법들이 있는데 예외 처리 귀찮으니 패스함.


신고

'20130827이전 > DX' 카테고리의 다른 글

3D 피킹 정리  (0) 2013.04.30
3D Picking  (0) 2013.04.07
짐벌락과 그 해결.  (0) 2013.04.03
월드 좌표계로의 변환  (0) 2013.04.01
D3DXMATRIX 와 D3DXMATRIXA16  (0) 2013.03.25
PURE DEVICE  (3) 2013.03.24
Posted by 흰둥에미

계속 구조 설계에 매진...

뭐랄까, 조엘 온 소프트웨어의 화성인 아키텍처같은 느낌이랄까..

아무것도 할 수 없을 것 같은 느낌과, No code is No Bug라는 말을 통감하고 있어서 코드를 못 짜고 있다.


게임 프레임워크의 설계 종류에는 여러 방법론이 있음.

어떤 분의 강연 pt에서 본 듯. 링크라도 달아주는게 예의지만 귀찮아서 다시 못 찾겠고, 머릿속에 있기에 대충 쓰고, 감사한 마음만.

Layer Based, Manager Based, Event Driven, Scene Based 요렇게 예시를 들었었다.


지금 공부하는 건 매니저 베이스의 코드들이고, 뭔가 짜면서 계속 아쉽다. 특히 오브젝트에 대해서!!

상위 클래스로 관리하는 것의 문제는, 실 객체만의 무언가를 하기가 어렵다는 것!

(이를 위해 커맨드 패턴도 있다. 간단하게 특정 커맨드에 따라 특정 동작이 수행됨)

캐스팅을 하거나, 타입을 알아서 객체만의 동작을 해야한다.

프로그래머란 무엇인가?! 귀차니즘의 대명사!

캐스팅이고 뭐고, 귀찮다. 그냥 되게 하자.


그래서 컴포넌트 패턴.


큰 모토는, 객체들을 조합해서 사용하는 것.

유용한 그림이 있어서 차용한다.

(by http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/)


매니저 베이스의 코드에서는 객체 특성에 따라, 필요한 객체를 상속받아 구현. 코드의 중복이 심하고, 구조상 불가능하거나 말이 안되게 구현해야 하는 경우가 있음. - IsA 구조

따라서 객체 정의시 필요한 속성들(컴포넌트 베이스)을 넣어주고, 실행 시점에 현재 상태와 관계있는 속성(실 컴포넌트)으로 인스턴스화 해주는게 기본적인 흐름.    - HasA 구조


여기까지...

그림은 그려지지만 코드를 못 짜겠는 상황!

슬럼프다! 놀면서 슬럼프다!



신고

'20130827이전 > 알고리즘' 카테고리의 다른 글

QuadTree  (0) 2013.03.06
A* 구현  (1) 2013.03.02
컴포넌트 패턴  (0) 2013.02.22
Strategy Pattern  (0) 2013.02.14
State Pattern  (1) 2013.02.14
기하 알고리즘  (1) 2013.01.31
Posted by 흰둥에미

QueryPerformanceFrequency와 QueryPerformanceCounter를 이용하여, 보다 정밀한 게임 시간 관리를 위해 사용.


원형

 BOOL WINAPI QueryPerformanceFrequency ( LARGE_INTEGER *lpFrequency );

 - 하드웨어가 정밀타이머를 지원하면, 0이 아닌값을 리턴

   lpFrequency에는 현재 performance counter에 의해 1초동안 카운트된 값을 넘겨줌.

 BOOL WINAPI QueryPerformanceCounter ( LARGE_INTEGER *lpPerformanceCount );

 - 함수 콜이 성공하면, 0이 아닌 값을 리턴

   lpPC에는 현재의 performance counter의 값을 전달해 줌.



특징

 - 예전의 하드웨어에서는 미지원하는 경우가 있었음.

   느림.

   멀티 코어의 경우, 해당 함수 호출시 얻어오는 값이 프로세서와는 상관 없으나,

   BIOS나 HAL의 버그로 인해, 프로세서에 따라 다른 값을 반환해 줄 수 있음.

   이 문제를 해결하기 위해선, SetThreadAffinityMask 함수를 이용해, 사용하는 프로세서를 강제할 수 있음.


   프로세서의 주파수를 따라가므로, 프로세서의 주파수를 올리는 터보부스트 기능이 있는 CPU에서는 원치않는 값이 나옴.

   (Win7에서는 위 문제가 없다고 함)

  

신고

'20130827이전 > WinAPI' 카테고리의 다른 글

GetMessage와 PeekMessage 차이  (0) 2013.02.16
QueryPerformanceCounter  (0) 2013.02.16
키보드 입력  (0) 2013.01.28
컴파일 관련 에러 - 1  (0) 2013.01.26
14장. 그리기  (1) 2013.01.20
13장. 메시지  (0) 2013.01.19
Posted by 흰둥에미

최근에 달린 댓글

최근에 받은 트랙백

글 보관함