제가 지금 테트리스를 만들고 있는데 그림처럼 1번 그림이 2번 그림처럼 되기를 원하는데 행렬 곱하는걸 어떻게 해줘야 할지
감이 안잡히네요
지금 처럼 특정키를 누르면 특정 축을 기준으로 회전 하는 소스인데요
if(KeyDown(DIK_Z))
{
list<BLUCK>::iterator Bliter= BluckList.begin();
for(BluckIter = BluckList.begin(); BluckIter != BluckList.end(); ++BluckIter)
{
if(BluckIter->m_BluckState== BLUCK_MOVE)
{
//BluckIter->m_vRot.z=D3DXToRadian(90);
//D3DXMatrixRotationZ(&BluckIter->m_mRot,90);
//D3DXMatrixRotationAxis(&BluckIter->m_mRot,&BluckIter->m_vPos,90);
//D3DXVec3TransformCoord(&BluckIter->m_vPos,&BluckIter->m_v_Z,&BluckIter->m_mTM);
//float temp=BluckIter->m_vPos.x;
//BluckIter->m_vPos.x+=BluckIter->m_vPos.y;
//BluckIter->m_vPos.y=temp;
//회전된 벡터 = (원래 벡터 - 회전 중심 벡터) * 회전 행렬 + 회전 중심 벡터
//BluckIter->m_vRot=(BluckIter->m_vPos - BluckList.begin()->m_vPos) * BluckIter->m_mRot + BluckList.begin()->m_vPos;
//이럴경우에는 주위의 모델을 회전시킬때..
// 기준모델과, 회전하려는 모델의 차이만큰
// 원점에서 이동시킨후 회전을 시켜야지..
}
}
}
변수들의 역할을 정했구요
D3DXVECTOR3 m_vPos;//정육면체 위치
D3DXVECTOR3 m_vRot;//정육면체 회전
D3DXVECTOR3 m_vScale;//정육면체 크기
D3DXMATRIX m_mTM;//정육면체 통합행렬
D3DXMATRIX m_mTrans;//정육면체 이동행렬
D3DXMATRIX m_mRot;//정육면체 회전행렬
D3DXMATRIX m_mScale;//정육면체 크기행렬
제가 하려는건 특정 블럭을 기준으로 회전하려고 하는건데요 이게 자꾸 월드행렬 좌표원점을 기준으로 회전을 해서요
참고로 저는 정육면체 클래스를 만들어서 리스트를 사용했구요 사용방식은 스위치문으로 블럭위치를 일일이 다 초기화 해줘서 특정 모양처럼 보이게 했습니다
case 1://일자형
bluck.m_vPos = D3DXVECTOR3(1,52,0);
bluck.m_vRot = D3DXVECTOR3(0,0,0);
bluck.m_vScale = D3DXVECTOR3(1,1,1);
D3DXMatrixIdentity(&bluck.m_mTM);
D3DXMatrixIdentity(&bluck.m_mScale);
D3DXMatrixIdentity(&bluck.m_mTrans);
D3DXMatrixIdentity(&bluck.m_mRot);
bluck.m_v_X=D3DXVECTOR3(1,0,0);
bluck.m_v_Y=D3DXVECTOR3(0,1,0);
bluck.m_v_Z=D3DXVECTOR3(0,0,1);
bluck.m_BluckState = BLUCK_MOVE;
BluckList.push_back(bluck);
bluck.m_vPos = D3DXVECTOR3(1,50,0);
bluck.m_vRot = D3DXVECTOR3(0,0,0);
bluck.m_vScale = D3DXVECTOR3(1,1,1);
D3DXMatrixIdentity(&bluck.m_mTM);
D3DXMatrixIdentity(&bluck.m_mScale);
D3DXMatrixIdentity(&bluck.m_mTrans);
D3DXMatrixIdentity(&bluck.m_mRot);
bluck.m_v_X=D3DXVECTOR3(1,0,0);
bluck.m_v_Y=D3DXVECTOR3(0,1,0);
bluck.m_v_Z=D3DXVECTOR3(0,0,1);
bluck.m_BluckState = BLUCK_MOVE;
BluckList.push_back(bluck);
bluck.m_vPos = D3DXVECTOR3(1,48,0);
bluck.m_vRot = D3DXVECTOR3(0,0,0);
bluck.m_vScale = D3DXVECTOR3(1,1,1);
D3DXMatrixIdentity(&bluck.m_mTM);
D3DXMatrixIdentity(&bluck.m_mScale);
D3DXMatrixIdentity(&bluck.m_mTrans);
D3DXMatrixIdentity(&bluck.m_mRot);
bluck.m_v_X=D3DXVECTOR3(1,0,0);
bluck.m_v_Y=D3DXVECTOR3(0,1,0);
bluck.m_v_Z=D3DXVECTOR3(0,0,1);
bluck.m_BluckState = BLUCK_MOVE;
BluckList.push_back(bluck);
bluck.m_vPos = D3DXVECTOR3(1,46,0);
bluck.m_vRot = D3DXVECTOR3(0,0,0);
bluck.m_vScale = D3DXVECTOR3(1,1,1);
D3DXMatrixIdentity(&bluck.m_mTM);
D3DXMatrixIdentity(&bluck.m_mScale);
D3DXMatrixIdentity(&bluck.m_mTrans);
D3DXMatrixIdentity(&bluck.m_mRot);
bluck.m_v_X=D3DXVECTOR3(1,0,0);
bluck.m_v_Y=D3DXVECTOR3(0,1,0);
bluck.m_v_Z=D3DXVECTOR3(0,0,1);
bluck.m_BluckState = BLUCK_MOVE;
BluckList.push_back(bluck);
break;
화면에 뿌려주는 소스입니다
for(BluckIter=BluckList.begin(); BluckIter != BluckList.end() ; ++BluckIter )
{
D3DXMatrixTranslation( &BluckIter->m_mTrans, BluckIter->m_vPos.x, BluckIter->m_vPos.y, BluckIter->m_vPos.z);
D3DXMatrixRotationYawPitchRoll(&BluckIter->m_mRot, BluckIter->m_vRot.y, BluckIter->m_vRot.x, BluckIter->m_vRot.z);
D3DXMatrixScaling(&BluckIter->m_mScale, BluckIter->m_vScale.x, BluckIter->m_vScale.y, BluckIter->m_vScale.z);
BluckIter->m_mTM = BluckIter->m_mScale * BluckIter->m_mTrans * BluckIter->m_mRot ;
g_pDevice->SetTransform(D3DTS_WORLD,&BluckIter->m_mTM);//통합행렬을 월드 좌표계로
g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
g_pDevice->SetStreamSource(0,m_pVB,0,sizeof(D3DFVF_XYZ_COLOR));
g_pDevice->SetFVF(FVF_XYZ_COLOR);
g_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,36);
}

댓글 0