[텍스쳐 직선 이동 공식] D3DXVec3Normalize( &vecNormalize, &vecDirection ); vecPOS += ( vecNormalize *fMove );
===================================================================================
int move = (한번에 이동할 거리);
vec3 dir = B - A; // 방향
float len = length( dir ); // 이동할 거리
dir = normalize( dir );
int moveCount = len / move; // 이동 횟수
vec3 dir = B - A; // 방향
float len = length( dir ); // 이동할 거리
dir = normalize( dir );
int moveCount = len / move; // 이동 횟수
for( int i = 0; i < moveCount; ++i )
{
A = A + dir * move; // 이동 중
}
A = B; // 이동 완료
{
A = A + dir * move; // 이동 중
}
A = B; // 이동 완료
/////////////////////////////////////////////////////////////////////////////////////////////
struct TAG_CARD // Card Data
{
D3DXVECTOR3 vecPOSBF; // Before Position
D3DXVECTOR3 vecPOSAF; // After Position
D3DXVECTOR3 vecNormalize; // Normalize
FLOAT fMove; // Move Data
INT nMVRepetition; // Move Repetition Count
{
D3DXVECTOR3 vecPOSBF; // Before Position
D3DXVECTOR3 vecPOSAF; // After Position
D3DXVECTOR3 vecNormalize; // Normalize
FLOAT fMove; // Move Data
INT nMVRepetition; // Move Repetition Count
};
// 이동할 위치 설정 ( 카드 객체, 이동할 좌표, 이동 횟수 )
HRESULT cCardMng::SetMovePosition( TAG_CARD& tagCard, D3DXVECTOR3 vecAfter, INT nMVRepetition )
{
const D3DXVECTOR3 vecDIR = vecAfter -tagCard.vecPOSBF; // 방향
tagCard.fMove = D3DXVec3Length( &vecDIR ) /static_cast< FLOAT >( nMVRepetition ); // 이동할 거리
tagCard.vecPOSAF = vecAfter; // 최종 이동할 위치
tagCard.nMVRepetition = nMVRepetition; // 이동 횟수
{
const D3DXVECTOR3 vecDIR = vecAfter -tagCard.vecPOSBF; // 방향
tagCard.fMove = D3DXVec3Length( &vecDIR ) /static_cast< FLOAT >( nMVRepetition ); // 이동할 거리
tagCard.vecPOSAF = vecAfter; // 최종 이동할 위치
tagCard.nMVRepetition = nMVRepetition; // 이동 횟수
D3DXVec3Normalize( &tagCard.vecNormalize, &vecDIR );
// 곡선이나 다른 값 대입 시 Normalize 대신 방정식을 넣는다. 현 좌표와 이동할 좌표 까지 루프를 돌리고 이동할 거리를 계속 넣어 주면 된다.
return S_OK;
}
}
// SetMovePosition() 으로 설정한 만큼 이동.
D3DXVECTOR3 cCardMng::DynamicMove( TAG_CARD& tagCard )
{
// vecPOSBF + vecNormalize * fMove -> 이동 공식
if( tagCard.vecPOSBF != tagCard.vecPOSAF ) // 목적지 도착했다면 넘어간다.
{
tagCard.vecPOSBF += ( tagCard.vecNormalize *tagCard.fMove );
if( tagCard.vecPOSBF > tagCard.vecPOSAF ) tagCard.vecPOSBF = tagCard.vecPOSAF;
// 만약 이동하는 좌표가 목적지를 초과하면 강제 대입 이동
} // >>> END if
{
// vecPOSBF + vecNormalize * fMove -> 이동 공식
if( tagCard.vecPOSBF != tagCard.vecPOSAF ) // 목적지 도착했다면 넘어간다.
{
tagCard.vecPOSBF += ( tagCard.vecNormalize *tagCard.fMove );
if( tagCard.vecPOSBF > tagCard.vecPOSAF ) tagCard.vecPOSBF = tagCard.vecPOSAF;
// 만약 이동하는 좌표가 목적지를 초과하면 강제 대입 이동
} // >>> END if
return tagCard.vecPOSBF;
}
}
- 조금씩 이동할 거리를 '이동할 좌표 - 현재 좌표' 한 값의 노멀라이징 한것에 곱해 주고 현재 좌표랑 더해 줘서 이동할 좌표 만큼 루프를 돌리면 직선 이동한다.
- 곡선이나 다른 값 대입 시 Normalize 대신 방정식을 넣는다. 현 좌표와 이동할 좌표 까지 루프를 돌리고 이동할 거리를 계속 넣어 주면 된다.
- 직접 좌표 건들 필요 없이 이렇게 사용 가능하다. 응용하면 곡선도 가능.
'[ Programing ] > DirtectX9' 카테고리의 다른 글
레지스터와 셰이더 (0) | 2010.06.01 |
---|---|
[ 선 그리기 ] ID3DXLine (0) | 2010.02.04 |
[해당 영역만 화면 출력 시키기] pd3dDevice->SetRenderState(); pd3dDevice->SetScissorRect(); (0) | 2010.01.31 |
3D 피킹 (2) | 2010.01.29 |
[ 기초 ] 텍스쳐 생성 (0) | 2009.12.24 |