void CIKLimb::BonesCallback2 (CBoneInstance* B) { SCalculateData* D=(SCalculateData*)B->Callback_Param; CIKLimb* L=D->m_limb ; float const *x=D->m_angles ; { Fmatrix bm;//=B->mTransform ; //tmp_pos .set(bm.c) ; // Fvector ra;B->mTransform.getXYZ(ra) ; // bm .setXYZ(-x[4],-x[5],-x[6]) ; Matrix tbm; float t[3]; t[0] = x[6]; t[1] = x[5]; t[2] = x[4] ; EulerEval(ZXY,t,tbm) ; IM2XM(tbm,bm) ; CKinematics *K=D->m_K; CBoneData& BD=K->LL_GetData(L->m_bones[2]) ; Fmatrix start;start.mul_43(K->LL_GetTransform(BD.GetParentID()),BD.bind_transform); Fmatrix inv_start;inv_start.invert(start); Fmatrix dif;dif.mul_43(inv_start,B->mTransform); Fmatrix ikdif; Fvector a; dif.getXYZ(a); XM2IM(dif,ikdif); //B->mTransform.mul_43(K->LL_GetTransform(BD.GetParentID()),BD.bind_transform); //B->mTransform.mulB_43(bm) ; B->mTransform.mul_43(start,bm); #ifdef DEBUG if(ph_dbg_draw_mask.test(phDbgDrawIKGoal)) { Fmatrix DBGG; DBGG.mul_43(*D->m_obj,B->mTransform); DBG_DrawMatrix(DBGG,0.3f); DBGG.mul_43(*D->m_obj,start); DBG_DrawMatrix(DBGG,0.3f); } #endif //bm.c .set(tmp_pos) ; } }
void CIKLimb::BonesCallback0 (CBoneInstance* B) { SCalculateData* D=(SCalculateData*)B->Callback_Param; CIKLimb* L=D->m_limb ; float const *x=D->m_angles ; Fmatrix bm; //tmp_pos .set(bm.c) ; //Fvector ra;B->mTransform.getXYZ(ra) ; Matrix tbm; float t[3]; t[0] = x[2]; t[1] = x[1]; t[2] = x[0] ; EulerEval(ZXY,t,tbm) ; IM2XM(tbm,bm) ; Fmatrix cmp_save;cmp_save.set(B->mTransform) ; CKinematics *K=D->m_K; CBoneData& BD=K->LL_GetData(L->m_bones[0]); B->mTransform.mul_43(K->LL_GetTransform(BD.GetParentID()),BD.bind_transform); #ifdef DEBUG if(ph_dbg_draw_mask.test(phDbgDrawIKGoal)) { Fmatrix DBGG; DBGG.mul_43(*D->m_obj,B->mTransform); DBG_DrawMatrix(DBGG,0.3f); } #endif B->mTransform.mulB_43(bm) ; #ifdef DEBUG if(ph_dbg_draw_mask.test(phDbgDrawIKGoal)) { Fmatrix DBGG; DBGG.mul_43(*D->m_obj,B->mTransform); DBG_DrawMatrix(DBGG,0.3f); } #endif Fmatrix cmp_savei;cmp_savei.invert(cmp_save); Fmatrix dif;dif.mul_43(cmp_savei,B->mTransform); }
void CCharacterPhysicsSupport::in_shedule_Update( u32 DT ) { ///VERIFY( 0 ); //CPHSkeleton::Update(DT); if(m_collision_activating_delay) UpdateCollisionActivatingDellay(); if( !m_EntityAlife.use_simplified_visual ( ) ) CPHDestroyable::SheduleUpdate( DT ); else if( m_pPhysicsShell&&m_pPhysicsShell->isFullActive( ) && !m_pPhysicsShell->isEnabled( ) ) m_EntityAlife.deactivate_physics_shell( ); movement( )->in_shedule_Update( DT ); #if 0 if( anim_mov_state.active ) { DBG_OpenCashedDraw( ); DBG_DrawMatrix( mXFORM, 0.5f ); DBG_ClosedCashedDraw( 5000 ); } #endif }
void CIKLimb::GoalMatrix(Matrix &M,SCalculateData* cd) { VERIFY(cd->m_tri&&cd->m_tri_hight!=-dInfinity); const Fmatrix &obj=*cd->m_obj; CDB::TRI *tri=cd->m_tri; CKinematics *K=cd->m_K; Fvector* pVerts = Level().ObjectSpace.GetStaticVerts(); Fvector normal; normal.mknormal (pVerts[tri->verts[0]],pVerts[tri->verts[1]],pVerts[tri->verts[2]]); VERIFY(!fis_zero(normal.magnitude())); Fmatrix iobj;iobj.invert(obj);iobj.transform_dir(normal); Fmatrix xm;xm.set(K->LL_GetTransform(m_bones[2])); //Fvector dbg; //dbg.set(Fvector().mul(normal,normal.y*tri_hight // -normal.dotproduct(xm.i)*m_toe_position.x // -normal.dotproduct(xm.j)*m_toe_position.y // -normal.dotproduct(xm.k)*m_toe_position.z-m_toe_position.x // )); normal.invert(); Fvector ax;ax.crossproduct(normal,xm.i); float s=ax.magnitude(); if(!fis_zero(s)) { ax.mul(1.f/s); xm.mulA_43(Fmatrix().rotation(ax,asinf(-s))); } Fvector otri;iobj.transform_tiny(otri,pVerts[tri->verts[0]]); float tp=normal.dotproduct(otri); Fvector add; add.set(Fvector().mul(normal,-m_toe_position.x+tp-xm.c.dotproduct(normal))); xm.c.add(add); Fmatrix H; CBoneData& bd=K->LL_GetData(m_bones[0]); H.set(bd.bind_transform); H.mulA_43(K->LL_GetTransform(bd.GetParentID())); H.c.set(K->LL_GetTransform(m_bones[0]).c); #ifdef DEBUG if(ph_dbg_draw_mask.test(phDbgIKAnimGoalOnly)) xm.set(K->LL_GetTransform(m_bones[2])); if(ph_dbg_draw_mask.test(phDbgDrawIKGoal)) { Fmatrix DBGG; DBGG.mul_43(obj,xm); DBG_DrawMatrix(DBGG,0.2f); DBGG.mul_43(obj,H); DBG_DrawMatrix(DBGG,0.2f); } #endif H.invert(); Fmatrix G; G.mul_43(H,xm); XM2IM(G,M); }
bool CPhysicObject::get_door_vectors ( Fvector& closed, Fvector& open ) const { VERIFY(Visual()); IKinematics *K = Visual()->dcast_PKinematics(); VERIFY(K); u16 door_bone = K->LL_BoneID("door"); if( door_bone==BI_NONE ) return false; const CBoneData &bd = K->LL_GetData( door_bone ); const SBoneShape &shape = bd.shape; if( shape.type != SBoneShape::stBox ) return false; if( shape.flags.test( SBoneShape::sfNoPhysics ) ) return false; Fmatrix start_bone_pos; K->Bone_GetAnimPos( start_bone_pos, door_bone, u8(-1), true ); Fmatrix start_pos = Fmatrix().mul_43( XFORM(), start_bone_pos ); const Fobb &box = shape.box; Fvector center_pos; start_pos.transform_tiny( center_pos, box.m_translate ); Fvector door_dir; start_pos.transform_dir(door_dir, box.m_rotate.i ); Fvector door_dir_local = box.m_rotate.i ; //Fvector door_dir_bone; start_bone_pos.transform_dir(door_dir_bone, box.m_rotate.i ); const Fvector det_vector = Fvector().sub( center_pos, start_pos.c ); if( door_dir.dotproduct( det_vector ) < 0.f ) { door_dir.invert(); door_dir_local.invert(); //door_dir_bone.invert(); } const SJointIKData &joint = bd.IK_data; if( joint.type != jtJoint ) return false; const Fvector2& limits = joint.limits[1].limit; //if( limits.y < EPS ) //limits.y - limits.x < EPS // return false; if( M_PI - limits.y < EPS && M_PI + limits.x < EPS ) return false; Fmatrix to_hi = Fmatrix().rotateY( -limits.x ); to_hi.transform_dir( open, door_dir_local ); Fmatrix to_lo = Fmatrix().rotateY( -limits.y ); to_lo.transform_dir( closed, door_dir_local ); start_pos.transform_dir(open); start_pos.transform_dir(closed); //DBG_OpenCashedDraw( ); #ifdef DEBUG if(dbg_draw_doors) { DBG_DrawMatrix( Fidentity, 10.0f ); DBG_DrawMatrix( XFORM(), .5f, 100 ); DBG_DrawMatrix( start_pos, 0.2f,100 ); const Fvector pos = start_pos.c.add( Fvector().set(0,0.2f,0) ); const Fvector pos1 = start_pos.c.add( Fvector().set(0,0.3f,0) ); DBG_DrawLine( pos, Fvector( ).add( pos, open ), D3DCOLOR_XRGB( 0, 255, 0 ) ); DBG_DrawLine( pos, Fvector( ).add( pos, closed ), D3DCOLOR_XRGB( 255, 0, 0 ) ); DBG_DrawLine( pos1, Fvector( ).add( pos1, det_vector ), D3DCOLOR_XRGB( 255, 255, 0 ) ); } #endif //DBG_ClosedCashedDraw( 50000000 ); return true; }
void CCharacterPhysicsSupport::in_UpdateCL( ) { if( m_eState==esRemoved ) { return; } #ifdef DEBUG if( dbg_draw_character_bones ) dbg_draw_geoms( m_weapon_geoms ); if( dbg_draw_character_bones ) DBG_DrawBones( m_EntityAlife ); if( dbg_draw_character_binds ) DBG_DrawBind( m_EntityAlife ); if( dbg_draw_character_physics_pones ) DBG_PhysBones( m_EntityAlife ); if( dbg_draw_character_physics && m_pPhysicsShell ) m_pPhysicsShell->dbg_draw_geometry( 0.2f, D3DCOLOR_ARGB( 100 ,255, 0, 0 ) ); #endif update_animation_collision(); m_character_shell_control.CalculateTimeDelta( ); if( m_pPhysicsShell ) { VERIFY( m_pPhysicsShell->isFullActive( ) ); m_pPhysicsShell->SetRagDoll( );//Теперь шела относиться к классу объектов cbClassRagDoll if( !is_imotion(m_interactive_motion ) )//!m_flags.test(fl_use_death_motion) m_pPhysicsShell->InterpolateGlobalTransform( &mXFORM ); else m_interactive_motion->update( ); UpdateDeathAnims(); m_character_shell_control.UpdateFrictionAndJointResistanse( m_pPhysicsShell ); } //else if ( !m_EntityAlife.g_Alive( ) && !m_EntityAlife.use_simplified_visual( ) ) //{ //ActivateShell( NULL ); //m_PhysicMovementControl->DestroyCharacter( ); //} else if( ik_controller( ) ) { update_interactive_anims(); ik_controller( )->Update(); } #ifdef DEBUG if(Type()==etStalker && ph_dbg_draw_mask1.test(phDbgHitAnims)) { Fmatrix m; m_hit_animations.GetBaseMatrix(m,m_EntityAlife); DBG_DrawMatrix(m,1.5f); /* IKinematicsAnimated *K = smart_cast<IKinematicsAnimated*>(m_EntityAlife.Visual()); u16 hb = K->LL_BoneID("bip01_head"); u16 pb = K->LL_GetBoneRoot(); u16 nb = K->LL_BoneID("bip01_neck"); u16 eb = K->LL_BoneID("eye_right"); Fmatrix &mh = K->LL_GetTransform(hb); Fmatrix &mp = K->LL_GetTransform(pb); Fmatrix &me = K->LL_GetTransform(eb); Fmatrix &mn = K->LL_GetTransform(nb); float d = DET(mh); if(Fvector().sub(mh.c,mp.c).magnitude() < 0.3f||d<0.7 )//|| Fvector().sub(me.c,mn.c) < 0.5 { K->CalculateBones_Invalidate(); K->CalculateBones(); ; } */ } #endif }