void CLanza::PosicionaPuntaLanza() { // Mat44f worldmatrix = GetInstance()->GetMat44(); std::string l_sName = GetInstance()->GetName(); CRenderableAnimatedInstanceModel* model = (CRenderableAnimatedInstanceModel*)CORE->GetRenderableObjectsManager()->GetInstance(l_sName); CalSkeleton* skeleton = model->GetAnimatedInstanceModel()->GetModelCal3DHW()->getSkeleton(); int l_HuesoManoDer = skeleton->getCoreSkeleton()->getCoreBoneId("hueso master"); if(l_HuesoManoDer != -1) { CalVector l_V3Position = (CalVector)skeleton->getBone(l_HuesoManoDer)->getTranslationAbsolute(); V3PosicionPuntaLanza.x = -l_V3Position.x; V3PosicionPuntaLanza.y = l_V3Position.y; V3PosicionPuntaLanza.z = l_V3Position.z; std::vector<CPhysicUserData*> m_vImpactObjects; Mat44f l_t,res; Mat44f l_vMat44 = GetInstance()->GetMat44(); l_t.SetIdentity(); V3PosicionPuntaLanza.y += 1.3f; l_t.Translate(V3PosicionPuntaLanza); res.SetIdentity(); res = l_vMat44*l_t; CORE->GetPhysicsManager()->OverlapSphereActor( 0.7f ,res.GetPos() ,m_vImpactObjects ,PX_MSK_ALL ,true ); if(!m_vImpactObjects.empty()) { std::vector<CPhysicUserData*>::iterator l_iter = m_vImpactObjects.begin(); for(;l_iter != m_vImpactObjects.end(); l_iter++) { if (!(*l_iter)->GetName().compare("mi_amigo")) { //hit player if((res.GetPos().y > 0.2f) && (m_bActiva)) //empieza a salir la lanza if(CCoreFIH::GetSingletonPtr()->GetPlayer()->CollideEnemies()) { CCoreFIH::GetSingletonPtr()->GetPlayer()->Hit(5); m_bActiva = false; } } } } } }
///////////////////////////////////// // Purpose: get the translation // to bring a point into the // bone instance space // of given boneID // Output: pLoc set // Return: none ///////////////////////////////////// void IgfxObject::BoneGetTransBoneSpace(s32 boneID, Vec3D *pLoc) { if(m_pCalModel) { CalSkeleton *pSkel = m_pCalModel->getSkeleton(); CalBone *pBone = pSkel->getBone(boneID); CalVector cVec = pBone->getTranslationBoneSpace(); pLoc->x = cVec.x; pLoc->y = cVec.y; pLoc->z = cVec.z; } }
//para calcular la posicion del humo en funciĆ³n del pie del zombie cuando muere void CZombie::PosicionaPieDerecho() { std::string l_sName = GetInstance()->GetName(); CRenderableAnimatedInstanceModel* model = (CRenderableAnimatedInstanceModel*)CORE->GetRenderableObjectsManager()->GetInstance(l_sName); CalSkeleton* skeleton = model->GetAnimatedInstanceModel()->GetModelCal3DHW()->getSkeleton(); int l_HuesoPieDer = skeleton->getCoreSkeleton()->getCoreBoneId("Bip01 R Foot"); CalVector l_V3Position = (CalVector)skeleton->getBone(l_HuesoPieDer)->getTranslationAbsolute(); V3PosicionPieDerecho.x = -l_V3Position.x; V3PosicionPieDerecho.y = l_V3Position.y; V3PosicionPieDerecho.z = l_V3Position.z; }
///////////////////////////////////// // Purpose: get the given bone's // bone space transformation // Output: pMtx filled // Return: none ///////////////////////////////////// void IgfxObject::BoneGetTransformMtx(s32 boneID, Matrix *pMtx) { if(m_pCalModel) { CalSkeleton *pSkel = m_pCalModel->getSkeleton(); CalBone *pBone = pSkel->getBone(boneID); CalMatrix cMtx = pBone->getTransformMatrix(); pMtx->_11 = cMtx.dxdx; pMtx->_21 = cMtx.dydx; pMtx->_31 = cMtx.dzdx; pMtx->_41 = 0; pMtx->_12 = cMtx.dxdy; pMtx->_22 = cMtx.dydy; pMtx->_32 = cMtx.dzdy; pMtx->_42 = 0; pMtx->_13 = cMtx.dxdz; pMtx->_23 = cMtx.dydz; pMtx->_33 = cMtx.dzdz; pMtx->_43 = 0; pMtx->_14 = 0; pMtx->_24 = 0; pMtx->_34 = 0; pMtx->_44 = 1; } }
///////////////////////////////////// // Purpose: get the rotation // to bring a point into the // bone instance space // Output: pQ set // Return: none ///////////////////////////////////// void IgfxObject::BoneGetRotateBoneSpace(s32 boneID, Quaternion *pQ) { if(m_pCalModel) { CalSkeleton *pSkel = m_pCalModel->getSkeleton(); CalBone *pBone = pSkel->getBone(boneID); CalQuaternion cQuat = pBone->getRotationBoneSpace(); pQ->x = cQuat.x; pQ->y = cQuat.y; pQ->z = cQuat.z; pQ->w = cQuat.w; } }
///////////////////////////////////// // Purpose: set the relative translation // of the given bone // Output: bone moved // Return: none ///////////////////////////////////// void IgfxObject::BoneSetTrans(s32 boneID, const Vec3D & loc) { if(m_pCalModel) { Vec3D trans; BoneGetTrans(boneID, &trans); CalSkeleton *pSkel = m_pCalModel->getSkeleton(); CalBone *pBone = pSkel->getBone(boneID); if(pBone) { pBone->setTranslation(CalVector(trans.x+loc.x, trans.y+loc.y, trans.z+loc.z)); pBone->calculateState(); } } }
void CZombie::PosicionaManoIzquierda() { // Mat44f worldmatrix = GetInstance()->GetMat44(); std::string l_sName = GetInstance()->GetName(); CRenderableAnimatedInstanceModel* model = (CRenderableAnimatedInstanceModel*)CORE->GetRenderableObjectsManager()->GetInstance(l_sName); CalSkeleton* skeleton = model->GetAnimatedInstanceModel()->GetModelCal3DHW()->getSkeleton(); int l_HuesoManoIzq = skeleton->getCoreSkeleton()->getCoreBoneId("Bip01 L Finger0"); CalVector l_V3Position = (CalVector)skeleton->getBone(l_HuesoManoIzq)->getTranslationAbsolute(); V3PosicionManoIzquierda.x = -l_V3Position.x; V3PosicionManoIzquierda.y = l_V3Position.y; V3PosicionManoIzquierda.z = l_V3Position.z; PosicionaTrigger(V3PosicionManoIzquierda, m_actManoIzquierda); }
PosAndOrient Cal3dModel::getPositionForSubmodel(const std::string &bone) const { PosAndOrient po; po.orient.identity(); po.pos = WFMath::Vector<3>(0, 0, 0); const std::string &mapped_bone = m_core_model->mapBoneName(bone); if (mapped_bone.empty()) return po; // Get a pointer to the bone we need from cal3d CalSkeleton * cs = m_calModel->getSkeleton(); if (cs == 0) { return po; } CalCoreSkeleton * ccs = cs->getCoreSkeleton(); if (ccs == 0) { return po; } int boneId = ccs->getCoreBoneId(mapped_bone); if (boneId == -1) { return po; } CalBone * cb1 = cs->getBone(boneId); if (cb1 == 0) { return po; } // Get the position and orientation of the bone in cal3d coordinates const CalQuaternion & cq = cb1->getRotationAbsolute(); const CalVector & cv = cb1->getTranslationAbsolute(); // Rotate the orienation into out coordinate system WFMath::Quaternion model_rotation(2, deg_to_rad(m_rotate)); // The second rotation translates object coords to world coords // the first rotation makes the coord system compatible // The third rotation takes into account the model rotation to make it // face the right way. po.orient = WFMath::Quaternion(1, WFMath::Pi / 2.0) * m_core_model->getBoneRotation(bone) * WFMath::Quaternion(cq.w, cq.x, cq.y, cq.z).inverse() * model_rotation; // Rotate the vector into our coordinate system po.pos = WFMath::Vector<3>(cv.x, cv.y, cv.z).rotate(model_rotation); return po; }
///////////////////////////////////// // Purpose: set the relative rotation // of the given bone // Output: bone rotated // Return: none ///////////////////////////////////// void IgfxObject::BoneSetRotate(s32 boneID, const Quaternion & q) { if(m_pCalModel) { Quaternion quat; BoneGetRotate(boneID, &quat); quat *= q; CalSkeleton *pSkel = m_pCalModel->getSkeleton(); CalBone *pBone = pSkel->getBone(boneID); if(pBone) { pBone->setRotation(CalQuaternion(quat.x, quat.y, quat.z, quat.w)); pBone->calculateState(); } } }
void CZombie::PosicionaManoDerecha() { // Mat44f worldmatrix = GetInstance()->GetMat44(); std::string l_sName = GetInstance()->GetName(); CRenderableAnimatedInstanceModel* model = (CRenderableAnimatedInstanceModel*)CORE->GetRenderableObjectsManager()->GetInstance(l_sName); CalSkeleton* skeleton = model->GetAnimatedInstanceModel()->GetModelCal3DHW()->getSkeleton(); int l_HuesoManoDer = skeleton->getCoreSkeleton()->getCoreBoneId("Bip01 R Finger0"); CalVector l_V3Position = (CalVector)skeleton->getBone(l_HuesoManoDer)->getTranslationAbsolute(); V3PosicionManoDerecha.x = -l_V3Position.x; V3PosicionManoDerecha.y = l_V3Position.y; V3PosicionManoDerecha.z = l_V3Position.z; PosicionaTrigger(V3PosicionManoDerecha, m_actManoDerecha); //CTriggerManager* tm = CORE->GetTriggerManager(); //tm->GetTrigger("z_inst_200 ManoDerecha")->SetPosition(m_actManoDerecha->GetPosition()); }
core::matrix4 CCal3DSceneNode::getBoneMatrix( s32 boneId ) const { if ( calModel == 0 ) return core::matrix4(); CalSkeleton* skeleton = calModel->getSkeleton(); CalBone* bone = skeleton->getBone(boneId); CalQuaternion rot = bone->getRotationAbsolute(); CalVector pos = bone->getTranslationAbsolute(); // Note: Swap Y and Z to convert to Irrlicht coordinates core::quaternion quat = core::quaternion( rot.x, rot.y, rot.z, rot.w ); core::vector3df v = core::vector3df( pos.x, pos.y, pos.z ); core::matrix4 mat = quat.getMatrix(); mat.setTranslation(v); return mat; }