Project BloodSummoner 2014. 7. 7. 12:04

cube 텍스쳐 생성 방법

ndivia dds 포토샵 플러그인을 다운 받아 설치 후 포토샵에서 제작


directx texture tool 에서 작성 (directx sdk)

Project BloodSummoner 2014. 7. 7. 11:51

행렬의 곱이 성립하려면

A 행렬은 l행 m열

B 행렬을 m행 n열이라고 정의할 때 두행렬의 곱셈이 성립하려면

A의 열과 B의 행이 같아야한다.

두 행렬 곱의 결과는 l행 n열의 행렬이 나온다.



행기준 변환 행렬일 때 벡터와의 곱셈 연산


mul(벡터, 행렬)



열기준 변환 행렬 예





열기준 변환 행렬일 때는 


mul(행렬, 벡터)


3D 이팩트를 공부하려면 기본적인 내용..

Project BloodSummoner 2014. 3. 3. 19:17

점과 구 충돌 여부 확인

구와 구의 충돌에 이어 똑같은 개념이다.


구의 중점과 점의 거리가 구의 반지름보다 작으면 구가 점을 포함하기 때문에 충돌여부를 알 수가 있다.


/******************************************************************************

 [5/21/2008 Hyun]

 Method:    IsCollisionPointToSphere

 FullName:  OcGlobalFunction::IsCollisionPointToSphere

 Access:    public  

 Returns:   BOOL

 Qualifier:

 Parameter: const D3DXVECTOR3 * pPos1 - 구 중점

 Parameter: const D3DXVECTOR3 * pPos2 - 점

 Parameter: float fRadius - 반지름의 제곱

 TODO : 점과 구 충돌 여부 확인 함수

******************************************************************************/

inline BOOL IsCollisionPointToSphere(const D3DXVECTOR3* pPos1, const D3DXVECTOR3* pPos2, float fRadius)

{


D3DXVECTOR3 vSub ;

D3DXVec3Subtract(&vSub, pPos1, pPos2) ;


if (fRadius*fRadius > D3DXVec3LengthSq(&vSub))

{

return TRUE ;

}


return FALSE ;

}

Project BloodSummoner 2014. 3. 3. 19:06

구와 구의 충돌 여부 확인

개념은 비교적 단순한데 2차원 평면상의 원은 중점과 반지름으로 표현이 가능하다.


원 A는 좌표가 (0,0) 이고 반지름이 5, 원 B는 좌표가 (10, 10)이고 반지름이 4라고 가정하면 


두 원 A와 B사이의 거리는 두원의 중점간의 거리가 된다.




두 중점간의 거리가 두 원의 반지름의 합보다 작거나 같으면 두 원은 충돌이다.



구는 x, y, z 좌표상의 중점과 반지름으로 표현이 가능하다.



3차원 좌표상의 구를 아래의 구조체로 표현을 한다고 가정하면


typedef struct tag_BoundingSphere

{

D3DXVECTOR3 _vCenter ;

float _fRadius ;

tag_BoundingSphere()

{


}


tag_BoundingSphere(const D3DXVECTOR3& v, float r)

{

_vCenter = v ;  _fRadius = r ;

}


} SBOUNDINGSPHERE, *LPSBOUNDINGSPHERE ;



inline BOOL IsCollisionSphereToSphere(const LPSBOUNDINGSPHERE pS1, const LPSBOUNDINGSPHERE pS2) 

{

return (pow(pS2->_vCenter.x - pS1->_vCenter.x, 2) + 

pow(pS2->_vCenter.y - pS1->_vCenter.y, 2) +

pow(pS2->_vCenter.z - pS1->_vCenter.z, 2) <

pow(pS1->_fRadius + pS2->_fRadius, 2)) ;

}


제곱근을 구하지 않는 이유는 루트연산이 부하가 크기 때문이며 루트 연산을 하지 않아도 의도한 결론을 얻을 수 있기 때문이다.

Project BloodSummoner 2014. 1. 28. 11:11

두 점을 지나는 직선의 2차원 평면상의 기울기를 구한다.

공식은 단순하다.


점 A(X1, Y1) 와 점 B(X2, Y2)가 있을 때 두 점을 지나는 직선의 기울기는 

 


샘플코드..

/******************************************************************************

[10/29/2008]

Method:    GetSlopePoint

FullName:  OcGlobalFunction::GetSlopePoint

Access:    public  

Returns:   float

Qualifier:

Parameter: D3DXVECTOR3 & vPointA - 점 1

Parameter: D3DXVECTOR3 & vPointB - 점 2

TODO : 두 점을 지나는 직선의 2차원 평면상의 기울기를 구한다.

******************************************************************************/

inline float GetSlopePoint(D3DXVECTOR3& vPointA, D3DXVECTOR3& vPointB)

{

return (vPointB.z - vPointA.z) / (vPointB.x - vPointA.x) ;

}



Project BloodSummoner 2014. 1. 27. 18:31

방향 벡터 구하기

두 점사이의 거리를 구해서 정규화하면 됩니다.


거리 = 도착점 - 시작점


DirectX 정규화 함수 

D3DXVECTOR3* D3DXVec3Normalize(D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV)



셰이더에서..


float4 position;

float4 lightPosition;


// 물체의 위치와 광원의 위치 정보를 받았다고 치고..


float3 lightDirection = position.xyz - lightPosition.xyz;        // 거리구하고

lightdirection = normalize(lightDirection);                          // 정규화