제가 지금 테트리스를 만들고 있는데 그림처럼 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);
}