[김재진] 카메라 시점 자동 설정

Programming/DirectX 2010. 7. 6. 17:01 Posted by 알 수 없는 사용자

카메라 시점 자동 설정(강제적으로 카메라를 Object를 바라 보도록 설정하기위한 방법)



Y값과 Z값은 0.1f 이상이어야 한다.
D3DXVECTOR3 DA = D3DXVECTOR3(0.0f, 0.1f, 0.0f); // Object 위치정보를 저장한 Vector Y값
m_fXAngle = D3DXVec3Dot(&DA, &m_vCameraPos);
zDA = D3DXVECTOR3(0.1f, 0.0f, 0.0f);                     // Object 위치정보를 저장한 Vector X값
m_fYAngle = -D3DXVec3Dot(&m_vCameraPos, &DA);

// D3DXToDegree : 값
// D3DXToRadian : 각도
// 회전값을 저장한 Quaternion변수에 Rotation값을 저장
D3DXQuaternionRotationYawPitchRoll( &m_qRotation
                                                     , D3DXToRadian(m_fYAngle)
                                                     , D3DXToRadian(m_fXAngle)
                                                     , 0.0f);
   

// 회전과 이동을 곱한 것을 m_qRotation을 행렬변수인 m_matOrientation로 변경
D3DXMatrixAffineTransformation(&m_matOrientation, 1.0f, NULL, &m_qRotation, &m_vCameraPos);

/* m_matOrientation을 m_matView에 반대값을 입력
    (카메라가 움직이는것이 아닌 월드행렬이 움직이는 것이기 때문에) */
D3DXMatrixInverse( &m_matView, NULL, &m_matOrientation );

단, 카메라의 위치가 Z축이 0.001보다 낮다면 X와 Y값의 변경 가중치 값을 변경해야 한다.
(0.5f 이상 변경해야함)

문제점 많은 오브젝트 시점 바라보게 만드는 코딩임...
해결할 사람 ㄱㄱㄱㄱ

[임지웅] DX - 법선맵핑 (Normal map)

Programming/DirectX 2010. 6. 10. 21:31 Posted by 알 수 없는 사용자

법선맵핑이란?
 법선 맵핑이란 텍스처의 텍셀(텍스처의 각 픽셀)에 RGB값대신 그 해당 텍셀의 법선 벡터가 들어간 법선맵텍스쳐를  사용해서 특수하게 맵핑하는 기법이다.

법선 맵핑을 사용하는 이유는?
  3D 모델링한 오브젝트는 결국은 2D화면에 출력되는데 미세한 요철(凹凸)등의 부분은 많은 폴리곤을 써서 고퀄리티로 만들더라도 실제로 표현될때는 픽셀단위로 표현되기때문에 세세하게 모델링된 폴리곤을 표현할수가 없다. 게다가 표현이 되지 않더라도 요철부분의 폴리곤들도 모두 연산되기때문에 메모리공간도 많이 잡아먹고 불필요한 부하가 걸리게 되므로 몹시 비효율 적이다.
 이런 문제를 해결하기 위해서 나온 효과적인 방법중하나로 법선맵핑이다.

요철(凹凸)을 표현하는 방법.
 요철이 요철로 보이는 이유는 튀어나온 부분과 들어간 부분에서 생기는 그림자 때문인데 그림자가 생기는 것은 광원과 밀접한 관계가 있다.
 광원처리에는 보는눈에 방향인 시점 벡터와 광원의 방향인 광원벡터, 그리고 오브젝트의 법선벡터가 필요한데, 광원 벡터와 법선벡터를 이용해서 빛의 반사를 계산해서 결국은 시점벡터에 보이게 되는것이므로 요철부분의 법선벡터만 있다면 음영을 만들어 요철처럼 표현할수있다.
 미세요철의 음영은 결국 픽셀에 그린 결과로 나오기만 하면 되므로, 픽셀단위로 법선벡터를 얻을 수 있으면 된다. 픽셀단위의 법선벡터를 얻기위해선 텍스쳐를 사용하면 된다.

법선맵(Normalmap) 텍스처
 텍스처를 입히면 텍스처의 텍셀의 보관된 RGB컬러 값을 화면에 그리는데, 텍스처의 텍셀의 컬러값에 RGB값대신 법선벡터의 값을 넣어두고 그 텍셀에서의 법선벡터값과 광원과의 광원처리 즉 반사를 연산하면 픽셀단위로 조명이 들어가기 때문에 미세요철의 음영을 표현할 수 있다.

텍스처의 텍셀에 RGB값대신 벡터(x.y.z)값을 넣는다.
 일반적인 텍스처의 텍셀의 경우 ARGB의 컬러값이 들어가는데 A(투명도)값을 제외한 RGB대신 벡터의 x, y, z,성분을 넣어준다.

R -> x  ,  G -> y  ,  B -> z

이렇게 텍셀에 법선벡터를 RGB값대신 넣어두는 텍스처를 법선맵(Normalmap)이라고 한다. 랜더링시에 이 법선맵의 법선벡터를 이용해서 광원처리를 한다.

법선맵의 종류
 법선맵 텍스처는 2D상의 법선벡터를 저장하고있지만 3D상의 오브젝트 폴리곤의 법선방향은 고려하지 않고있으므로 바로 사용할수는 없고 좌표계 통일을 위한 변환이 필요하다. 여기서 기준 좌표계에따라서 오브젝트 공간 법선맵과 접선공간 법선맵으로 나뉜다.

-오브젝트공간 법선맵
 법선벡터가 기준으로 삼는 좌표계가 오브젝트의 로컬 좌표계이다. 즉 오브젝트의 원점이 법선벡터들의 원점이된다. 이 기법은 오브젝트가 몰핑(다른 오브젝트등에 묻히는)되지않는 벽면이나 바닥 갑옷등에 사용하면 좋다. 하지만 케릭터등의 오브젝트는 애니메이션될때 스키닝기법을 써서 정점을 몰핑하는데 몰핑되면 법선벡터의 방향이 바껴야 되서 오브젝트공간 법선맵은 사용할수가없다. 또 좌우대칭되는 오브젝트의 경우 텍스처를 반쪽만 만들어서 대칭으로 맵핑하는 기법을 사용하는데, 오브젝트공간 법선맵은 기준좌표계가 오브젝트의 로컬 좌표계이기 때문에 대칭점에서 법선벡터가 달라서 전체에 대해서 법선맵을 만들어줘야된다.

-접선공간 법선맵
 정점공간 법선맵이라고도 한다. 이 방법은 모든 법선벡터를 각 정점이 원점이되는 접선공간으로 변환해서 보관하는 방식인데 잘 모르겠으요 -_-; 나중에 뒤에서 나온답니다;;

법선맵핑의 효과
  법선맵핑은 저폴리곤 모델을 고폴리곤처럼 보여주는 기법이다. 일반적으로 1000개 정도의 폴리곤에 법선맵을 적용할경우 20000~30000개의 폴리곤으로 모델링한것 이상의 효과를 볼수있다.
 즉 저폴리곤 모델 + 법선맵 = 고폴리곤 모델

법선맵 생성하기
 -놉이맵에 의한 생성법
 텍스처를 흑백으로 변환하면 높이맵이 생성된다 (흰색은 높고 검은색은 낮은걸로 치면 0~255의 높이맵이된다). 이 높이맵에서 인접한 텍셀들간의 고저차를 비교해서 기울기를 나타내는 미분벡터를 만든다.(미분하면 기울기가 나온다) 이렇게 만들어진 미분벡터 2개(x방향으로의 미분벡터, y방향으로의 미분벡터)를 외적하면 법선벡터가 만들어지는데 이 법선벡터가 그 텍셀의 법선벡터가 된다.

-오브젝트 비교에 의한 생성법
 오브젝트를 저폴리곤과 고폴리곤으로 두 개를 만들고 두 모델의 차이를 비교해서 법선맵을 만드는 방법이다. 저폴리곤 모델의 텍셀에서 고폴리곤으로 직선을 쏴서 접하는 지점의 법선벡터를 저장하는 방법이다.
 요즘에는 이방법을 사용하는 추세다.

벡터를 RGB로 변환하는 방법
 법선벡터는 단위벡터이므로 단위 벡터 v 를 RGB로 변환한다.
 ARGB중에 투명값을 나타내는 A값은 제외하고 RGB값에 각각 벡터v의 (x, y, z)값이 들어가게되는데 벡터는 단위벡터이므로 -1 에서 +1의 값이고 RGB값은 각각 8비트이므로 0 에서 255사이의 값이다. 그래서 -1 -> 0 ,  1 -> 255에 대응되게 해야되는데 그 함수는 다음과 같다.

R = (DWORD) (127.0 * x + 128.0)
G = (DWORD) (127.0 * y + 128.0)
B = (DWORD) (127.0 * z + 128.0)

Color = ( (R<<16) | (G<<8) | B )

이렇게 하면 Color값에는 벡터 v = (x, y, z)의 정보가 RGB값으로 변환되어 들어가게 된다.
# ARGB에 각각 8비트씩 할당해서 값을 저장하지않고 A값과 B의 값을 제외하고 R,G값에 x, y 를 각각 16비트씩 변환하면 보다 정밀도를 높게 할 수 있다. z값은 벡터 v가 단위벡터이므로 루트(x^2 + y^2 + z^2) = 1임을 이용해서 얻을 수 있는
z = 루트( 1 - (x^2 + y^2) ) 식으로 x, y값을 이용해 z값을 넣어주면된다.

# 법선맵 디자인툴에는 Z-BRUSH등이 있다.

===============================================================================================================
결국 오브젝트에 텍스처 + 법선맵 텍스처를 혼합해서 적용해서 픽셀당 조명효과로 오브젝트의 요철을 효과적으로 표현하는 방법이었습니다 !!
일단 간단(?)하게 정리해봤는데요. 좀이라도 도움이 됬음 좋겠네요;; 소스는 첨부파일

<-


보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[강민수] DirectX-기초수학

Programming/DirectX 2010. 6. 10. 11:52 Posted by 리뷰하는 (게임)프로그래머_리프TV

삼각 함수

3개의 변 A, B, C가 존재 할 때
A(빗변)의 제곱 = B(밑변)의 제곱 + C(높이)의 제곱

cos = 밑변 / 빗변 ( r = 1, 밑변의 길이 )
sin = 높이 / 빗변 ( r = 1, 높이의 길이 )
tan = 높이 / 밑변 ( r = 1, 연장선의 높이의 길이?ㅋ )

밑변 : 세타 + 직각이 있는 곳
빗변 : 세타 + 직각이 아닌 곳
높이 : 직각 + 세타가 아닌 곳

  0 도 30 도 45 도 60 도 90 도
 cos  루트3/2   루트2/2  1/2  0
 sin 0  1/2  루트2/2  루트3/2  1
 tan  루트3/3  1  루트3  무한

파이/2 = 90도
파이 = 189도
3파이/2 = 270도
2파이 = 360도

역수란?

a의 역수 = 1/a ( 즉, 곱하였을 때 1이 되는 수 )

1/cos세타 -> cos세타의 역수 -> sec세타 라고 함
1/sin세타 -> sin세타의 역수 -> cosec세타 라고 함
1/tan세타 -> tan세타의 역수 -> cotan세타 라고 함

덧셈 정리( 가법 정리 )

cos( A + B ) = ( cos A * cos B ) - ( sin A * sin B )
cos( A - B ) = ( cos A * cos B ) + ( sin A * sin B )
sin( A [+ or -] B ) = ( sin A * cos B ) [+ or -] ( cos A * sin B )

벡터
단위 벡터 : 방향을 가지는 크기가 1인 벡터

벡터의 내적, 외적
내적 : 두 벡터 안의 각
외적 : 법선 벡터를 구하기 위해 사용

벡터 A - 벡터 B = 벡터 B에서 A로 이동하는 벡터
벡터 B - 벡터 A = 벡터 A에서 B로 이동하는 벡터

벡터 A + 벡터 B = 그 사이를 가로 지르는 벡터

asin, acos, atan

사용 이유 : 2변의 길이를 알고, 세타의 각을 모를 때
세타를 도출하기 위해 필요 하다.

ps : 글만 봐서는 무슨 내용이신지 잘 모르실 겁니다.

딱히 그렇다고 그림을 찾아서 끼우기 보단 제가 직접 그리면서 설명을 하게 될거 같으니,
최대한 열심히 설명 하겠지만, 자신은 없네요 ㅎㄷㄷ

[손동진] 빌보드 (Billboard)

Programming/DirectX 2010. 6. 7. 15:42 Posted by 알 수 없는 사용자
1. 빌보드

텍스처중 항상 정면을 바라봐야 하는 경우가 있는데, 이러한 처리를 하기 위한 전문적인 기법을 '빌보드'라고 한다.

예를 들어 길가의 나무, 파티클 등의 이펙트를 출력하는 용도로 많이 사용한다.


1.1 빌보드의 종류

 종류
 용도
 Y축 빌보드
 지면에 고정된 이미지 출력
 전체 화면 빌보드
 파티클 등의 이미지 출력


1.1.1 Y축 빌보드

카메라 변환 행렬의 성분 중, Y축 회전 행렬 부분만 역변환하면 빌보드를 구할 수 있다.




1.1.2 전체 화면 빌보드

카메라 변환 행렬의 성분 중, 회전 행렬 전체를 역변환하면 빌보드를 구할 수 있다.


[김재진]3D그래픽스의 개념과 렌더링파이프라인

Programming/DirectX 2010. 5. 27. 19:32 Posted by 알 수 없는 사용자
http://allosha.tistory.com/9
일본 저자가 쓴걸 번역해서 올린거 같은데 렌더링 파이프라인에 대해서 자세하게 나왔으니 확인하시기 바랍니다.

'Programming > DirectX' 카테고리의 다른 글

[강민수] DirectX-기초수학  (0) 2010.06.10
[손동진] 빌보드 (Billboard)  (0) 2010.06.07
[김재진]행렬의 곱셈 및 항등행렬 설명  (0) 2010.05.27
[손동진] 재질과 광원  (0) 2010.05.27
[김재진] 3D 행렬  (1) 2010.05.24

[김재진]행렬의 곱셈 및 항등행렬 설명

Programming/DirectX 2010. 5. 27. 19:27 Posted by 알 수 없는 사용자

 행렬의 곱셈
   
 
행렬의 곱셈에서는 순서가 바뀌면 값도 바뀝니다. 위의 행렬 순서를 아래와 같이 바꾸면...

그래서 행렬 곱셈시에는 순서가 중요합니다.


 항등행렬  

  어떤 행렬에 항등행렬을 곱하면(단 차수가 동일할 것), 원래의 행렬값이 됩니다.
  A * I = A = I * A = A

  하지만 항등행렬은 행렬곱셈에서 봤던 것처럼 순서가 중요하지 않습니다.  순서가 바뀌어도 결과가 동일하기 때문이죠
  항등행렬이 되려면 n * n 과 같은 정사각형의 행렬이어야 하며, 대각선이 모두 1로 구성되어 있고, 나머지는 0으로 채워져 있다는 점입니다.  
 
  3차원 항등행렬을 보겠습니다.  
 

위의 행렬을 곱하는 순서에 관계없이 어떤 행렬에 곱셈을 할경우 동일한 결과가 나오는데 이를 항등행렬이라 합니다

출처 : http://eecs.tistory.com/entry/3D프로그래밍의-첫걸음-행렬

'Programming > DirectX' 카테고리의 다른 글

[손동진] 빌보드 (Billboard)  (0) 2010.06.07
[김재진]3D그래픽스의 개념과 렌더링파이프라인  (0) 2010.05.27
[손동진] 재질과 광원  (0) 2010.05.27
[김재진] 3D 행렬  (1) 2010.05.24
DirectX-정점  (1) 2010.05.20

[손동진] 재질과 광원

Programming/DirectX 2010. 5. 27. 17:27 Posted by 알 수 없는 사용자
1. 재질
재질이란 메시(또는 물체)의 표면 상태를 말하는 것으로 빛이 물체의 표면에서 반사되어 변화된 뒤 사람의 눈에 들어오기까지의 과정을 수학적으로 모델링하기 위해서 사용하는 값들이다.

1.1 재질의 종류
  • 주변색 (ambient)
    • 광원의 위치와 무관하게 똑같은 양으로 모든 점에서 반사되는 색
  • 확산색 (diffuse)
    • 광원에서 반사될 때 출력되는 가장 주된 색
  • 반사색 (specular)
    • 특정한 방향으로만 반사되는 색. 광원의 위치와 카메라의 위치에 따라서 달라진다.
  • 방출색 (emissive)
    • 메시 표면에서 자체적으로 방출되는 색. 단, 이 빛이 다른 메시에 영향을 주지는 못 한다.

2. 광원의 종류
  • 주변 광원 (ambient light)
    • 3차원 공간 내에서 메시의 배치나 위치와는 전혀 상관없이 똑같은 양으로 모든 곳을 비추는 빛의 강도를 말한다. 방향, 위치가 없으며 색과 강도만이 존재한다.
  • 점 광원 (point light)
    • 직관적으로 가장 쉽게 생각할 수 있는 빛이다. 예를 들면, 백열전구를 생각하면 된다. 광원의 위치에 따라 빛의 강도가 달라진다.
  • 방향성 광원 (directional light)
    • 모든 광원의 방향이 하나의 방향을 갖는 것으로 완벽하지는 않지만 태양을 예로 들 수 있다. 광원의 위치는 상관 없고, 방향이 가장 중요한 요소다.
  • 점적 광원 (spot light)
    • 정해진 위치와 범위에만 비추는 특수한 조명을 말한다. 흔히 영화나 쇼무대에서 사용하는 스포트라이트 조명을 생각하면 된다.

이들 광원 모델은 D3D의 고정함수 파이프라인을 사용할 때만 유효하고, 정점 셰이더와 픽셀 셰이더를 사용하게 되면 모두 무용지물이 된다.



* 용책 요약 (p. 161)
  • Direct3D는 방향성 광원과 점 광원, 스포트 광원의 세 가지 광원 모델을 제공하며, 광원은 환경광(ambient)과 난반사광(diffuse), 정반사광(specular)의 세 가지 빛을 발산한다.
  • 펴면의 재질은 표면과 표면에 닿는 빛과의 상호작용을 정의한다. (반사 되거나 흡수될 빛의 양을 조정하여 표면의 컬러를 결정한다.)
  • 버텍스 법선은 버텍스의 방향을 정의하며 Direct3D는 버텍스 법선을 이용해 버텍스에 빛이 닿는 각도를 계산해낸다. 버텍스의 법선이 삼각형의 법선과 동일한 경우도 있지만 부드러운 표면(구체, 원통 등)을 표현하는 경우에는 그렇지 않은 경우도 있다.

[김재진] 3D 행렬

Programming/DirectX 2010. 5. 24. 01:31 Posted by 알 수 없는 사용자
// 1000 밀리초마다 한바퀴씩 (2*pi) 회전 애니메이션 행렬을 생성.
// (1.0f * D3DX_PI) 회전속도
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0;

// y축을 회전축으로 회전하는 행렬을 생성
D3DXMatrixRotationY(&matWorld, fAngle); 

 // 시점 좌표값 설정 d3dx9math.h 참조
 // 뷰 행렬을 정의하기 위해서 3가지의 값이 필요
 D3DXVECTOR3 vEyePt(0.0f, 3.0f, -5.0f);   // 1. 눈의 위치를 0.0f, 3.0f, -5.0f - 카메라 좌표
 D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f); // 2. 눈이 바라보는 위치(0,0,0) - 사물의 위치
 D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);    // 3. 천정방향을 나타내는 상방 벡터 ( 0,1,0)

D3DXMATRIXA16 matView; // 좌표를 저장할 변수 클래스 선언

// 1,2,3의 값으로 뷰 행렬 생성
 D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);

D3DXMatrixLookAtLH 함수 설명 및 왼손계 설정구현
http://blog.naver.com/peroz/60057859092

// 프로젝션 행렬을 정의하기 위해서는 시야각(FOV=Field of View)과 종횡비(aspect ratio), 클리핑 평면의 값이 필요
 D3DXMATRIXA16 matProj;
 // matProj     : 값이 설정될 행렬
 // D3DX_PI / 4 : FOV(D3DX_PI/4 = 45도)
 // 1.0f        : 종횡비
 // 1.0f        : 근접 클리핑 평면(near clipping plane)
 // 1.0f        : 원거리 클리핑 평면(far clipping plane)
 // 투영 변환 행렬 함수
 D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);

 D3DXMatrixPerspectiveFovLH()함수와 D3DXMatrixLookAtLH()함수의 'LH' 는 왼손 좌표계를 의미한다.

위의 D3DXMatrixPerspectiveFovLH()함수와 D3DXMatrixLookAtLH() 함수를 각각  D3DXMatrixPerspectiveFovRH(), D3DXMatrixLookAtRH() 함수로 변경하면 회전하는 방향이 달라진다.


사용 lib
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"winmm.lib")

사용된 Header File
#include <Windows.h>
#include <MMSystem.h>
#include <d3dx9.h>
#include <d3d9.h>

'Programming > DirectX' 카테고리의 다른 글

[김재진]행렬의 곱셈 및 항등행렬 설명  (0) 2010.05.27
[손동진] 재질과 광원  (0) 2010.05.27
DirectX-정점  (1) 2010.05.20
DirectX-전체 화면 하는 방법  (1) 2010.05.19
스터디때 쓰일 발표 자료..  (1) 2010.05.17

DirectX-정점

Programming/DirectX 2010. 5. 20. 00:30 Posted by 리뷰하는 (게임)프로그래머_리프TV



재대로 파악한건지 아닌지 솔직히 잘 모르겠습니다만,

어느정도 맞는거? 같아요...

트랙백 걸어 놉니다.

스터디때 보아요.

'Programming > DirectX' 카테고리의 다른 글

[김재진]행렬의 곱셈 및 항등행렬 설명  (0) 2010.05.27
[손동진] 재질과 광원  (0) 2010.05.27
[김재진] 3D 행렬  (1) 2010.05.24
DirectX-전체 화면 하는 방법  (1) 2010.05.19
스터디때 쓰일 발표 자료..  (1) 2010.05.17