Loading...
2010. 5. 13. 23:58

픽킹

3d 게임에서 중요한 부분을 차지하고 있는 픽킹. 이번기회에 다시 한번 정리해보자. 1. 카메라 공간에서 픽킹광선의 계산. // 뷰포트 정보를 얻는다. UINT numViewports = 0; device->RSGetViewports(&numViewports, NULL); // 뷰포트의 갯수를 얻는다. D3D10_VIEWPORT* vp = new D3D10_VIEWPORT[numViewports]; device->RSGetViewports(&numViewports, vp); // 보통 뷰포트는 하나므로 처음것을 가져온다. float vpWidth = (float)vp[0].Width; float vpHeight = (float)vp[0].Height; /* 카메라 공간에서 피킹광선 계산 피킹광선은 카메라..

2010. 5. 11. 22:27

경계볼륨 - 경계구, 경계상자

가장 간단한 충돌검사 방법이 경계구와 경계상자이다. 사실 딱히 할말이 없다.. 그냥 구와 상자 메시파일을 읽어들여 기존 주전자 메시파일의 월드에 맞춘것일뿐.

2010. 5. 11. 21:22

3ds mesh file load

3ds 파일포맷은 autodesk의 포맷인데 이 포맷 자체는 오래전의 포맷이고 여러가지 제약(최대 가능 정점 및 삼각형 개수등)이 있어서 사용하는데 불편이 있어 요즘은 많이 쓰지 않는다. 3ds파일을 조각(chunk)이라는 데이터 블록들의 나열로 구성된다. 각 조각은 내부에 부조각을 포함할 수 있는 계층구조를 이룬다. 한 조각은 정점 데이터, 삼각형 데이터, 텍스쳐 데이터 등의 정보를 표현한다. 3ds를 로드하는 Mesh3DS 클래스는 애니메이션은 지원이 되지 않고 텍스쳐 매핑까지만 지원이 가능하도록 제작되었다. .fx파일은 그다지 바뀐것이 없다. shader 공부하고싶어 시작한 공부인데 shader는 언제즘 해보는걸까...헐.

2010. 5. 11. 01:09

mesh 생성

이전 작업이 파일로부터 mesh를 읽어들이는 것이었다면 이번 작업은 mesh를 구성하는것이다. 기본적으로는 dx9 같이 몇몇개의 서브셋으로 구성되어져 있다. 하지만 생성하는 절차와 사용하는 api가 조금 다르다. ID3DX10Mesh* mesh = NULL; // 메시 - (정점, 인덱스, 속성버퍼를 가진다) 1. 정점 구조체의 형식을 결정하고 d3d10_input_element_desc 구조체를 준비하고 입력레이아웃을 생성 D3D10_INPUT_ELEMENT_DESC elements[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "NORMAL", 0, DXGI_FORMAT_R32G3..

2010. 5. 9. 01:51

3ds 로드, 가상트랙볼

가상트랙볼 - 마우스의 위치는 트랙볼의 표면에서의 한 위치에 대응, 마우스가 움직이면 트랙볼이 움직이는 것처럼 구현. - 구 표면에서의 각 지점이 카메라의 방향에 해당, 카메라의 회전은 구 표면에서의 한 점이 표면의 다른 점으로 이동하는 것에 해당. - 반경이 1이고 항상 윈도우의 중심에 있다고 가정. 사실 가상트랙볼 쿼터니온 공식은 온전히 다 이해하지를 못하겠다..ㅡㅡ;.. 3d mesh - 3ds file load http://mgun.tistory.com/401 를 참조하자. .fx 도 딱히 달라진점이 없다.

2010. 5. 8. 14:15

카메라 클래스 - 쿼터니온

이전의 오일러랑 같은역활을 하긴 하지만 오일러의 단점을 보완하는 쿼터니온이 상당히 중요하다. 오일러의 단점으로 보면 - 각 축에 대한 회전의 적용순서가 다양하여 순서가 다르면 결과가 달라져 혼란을 야기한다. - 회전자유도가 3이지만 첫번째 회전축과 세번째 회전축이 거의 일치될 때 회전 자유도가 하나 감소하는 짐벌락 현상이 발생한다. - 회전을 오일러 각도로 표시하면 각 회전에 대한 오일러 각도가 유일하지 않다. - 두 오일러각도의 보간이 유일하지 않다.(보간경로의 문제) 이러한 단점을 보완하기 위해 쿼터니온을 사용한다. 사원수는 3차원에 적용하여 공간에서의 방향을 표현한다. 사원수의 장점 - 한 사원수는 하나의 4차원 벡터이고 3차원 공간에서의 한 방향을 표시 - 사원수는 단위벡터 - 사원수를 행렬로 또..

2010. 5. 7. 07:07

카메라 클래스 - 오일러

이번에는 오일러를 바탕으로 한 간단한 카메라 클래스를 만들었다. 카메라에서 중요한건 회전이다. 이 회전처리하는 부분을 잘 보도록 하자. 뷰행렬 x y z | rx ux lx 0 | V = | ry uy ly 0 | | rz uz lz 0 | |-pr -pu -pl 1 | void CameraEular::GetViewMatrix(D3DXMATRIX* vmat) { // right, up, look 벡터들를 모두 단위벡터로 정규화. D3DXVec3Normalize(&lookAt_, &lookAt_); D3DXVec3Cross(&up_, &lookAt_, &right_); // up D3DXVec3Normalize(&up_, &up_); D3DXVec3Cross(&right_, &up_, &lookAt_); ..

2010. 5. 5. 15:09

Depth Stencil ( orbit )

이 예제는 두가지 부분이 추가되었다. 하나는 간단한 행렬계산으로서 같은 오브젝트를 위치회전값을 조절하여 orbit로 만든 것이다. // 첫번째 상자가 스핀하도록 월드행렬을 갱신한다. static float t = 0.0f; t += timeDelta * (float)D3DX_PI * 0.5f; if (t > D3DX_PI*2.0f) t = 0.0f; D3DXMatrixRotationY( &matWorld1, t ); pkmatWorld->SetMatrix((float*)&matWorld1); // 두번째 상자가 원점을 중심으로 회전하도록 월드행렬을 갱신한다. D3DXMATRIX mScale; D3DXMatrixScaling( &mScale, 2.0f, 0.5f, 1.0f ); D3DXMATRIX mSpi..