int CEditModel::PickSkeletal( PickSkeletalParam& Pick ) { if( !GetSketetalFrame()|| !GetAnimateGroup() ) return GERROR; CCamera* pCamera = CMainWindowTarget::GetInst()->GetCamera(); CMatrix matView = pCamera->getViewMatrix(); matView.InvertFast(); CMatrix matProj = pCamera->getProjectionMatrix(); CMatrix matViewProj = pCamera->getViewProjectMatrix(); UINT i = 0,j = 0; for( i = 1; i < m_RenderMatrix.GetSkeletalCount(); i++ ) { m_SkeletalPos[i].m_IsSelected = FALSE; CMatrix tScaleMat; CMatrix tRotateMat; tRotateMat.SetRotateZ(-CMath::half_pi); tScaleMat.SetScale(CVector3f(m_SkeletalPos[i].m_Scale)); if(!m_RenderMatrix.m_pMatrixUnit[i]) continue; CMatrix matrix = m_RenderMatrix.m_pMatrixUnit[i]->GetMATRIX(); CVector3f PickVer[6]; CVector3f cur = CVector3f( (float)Pick.m_CurPos.x, (float)Pick.m_CurPos.y, 0); float z = FLT_MAX; int n1 = 0, n2 = 0; for( j = 0; j < 6; j++ ) { PickVer[j] = SklPos[j]; PickVer[j].FastMultiply(tScaleMat*tRotateMat*matrix ); //z = min( PickVer[j].z, z );//求出这个点的zubffer以便于之后选择离屏幕最近的那根骨骼 } CVector3f v; v.x = ( cur.x/Pick.m_Size.x - 1 ) / matProj._11; v.y = -( cur.y/Pick.m_Size.y - 1 ) / matProj._22; v.z = 1.0f; CVector3f vPickRayDir,vPickRayOrig; vPickRayDir.x = v.x*matView._11 + v.y*matView._21 + v.z*matView._31; vPickRayDir.y = v.x*matView._12 + v.y*matView._22 + v.z*matView._32; vPickRayDir.z = v.x*matView._13 + v.y*matView._23 + v.z*matView._33; vPickRayOrig.x = matView._41; vPickRayOrig.y = matView._42; vPickRayOrig.z = matView._43; float fu,fv,fd; BOOL IsPicked = FALSE; for( j = 0; j < 8; j++) { WORD* ind = SkeletalIndex + j*3; IsPicked = CMath::IntersectTri(PickVer[ind[0]],PickVer[ind[1]],PickVer[ind[2]],vPickRayOrig,vPickRayDir,fu,fv,fd); if(IsPicked) break; } if( /*z<Pick.m_Z&&*/IsPicked ) { //Pick.m_Z = z; Pick.m_SkeletalID = i; } } if( Pick.m_SkeletalID ) { m_SkeletalPos[ Pick.m_SkeletalID ].m_IsSelected = TRUE; } Pick.m_SkeletalName = GetSketetalFrame()->GetRootSkeletal().GetSkeletalNameByID( Pick.m_SkeletalID ); DataChange(); return 0; }