Example #1
0
OBB* RagDoll::CreateBoneBox(Bone* parent, Bone *bone, D3DXVECTOR3 size, D3DXQUATERNION rot) {
    if (bone == NULL || parent == NULL)
        return NULL;

    D3DXMATRIX &parentMat = parent->CombinedTransformationMatrix;
    D3DXMATRIX &boneMat = bone->CombinedTransformationMatrix;
    D3DXVECTOR3 parentPos(parentMat(3, 0), parentMat(3, 1), parentMat(3, 2));
    D3DXVECTOR3 bonePos(boneMat(3, 0), boneMat(3, 1), boneMat(3, 2));

    D3DXQUATERNION q;
    D3DXVECTOR3 p, s;
    D3DXMatrixDecompose(&s, &q, &p, &parentMat);
    q *= rot;
    D3DXQuaternionNormalize(&q, &q);

    p = (parentPos + bonePos) * 0.5f;

    OBB *obb = new OBB(p, size, q, true);

    physicsEngine.GetWorld()->addRigidBody(obb->m_pBody);
    m_boxes.push_back(obb);

    parent->m_pObb = obb;
    parent->m_pivot = obb->SetPivot(parentPos);

    return obb;
}