いつもお世話になっています。
dxライブラリ独自の.mv1形式のモデルと物理エンジンBullet
の組み合わせ方について質問させて頂きたいことがあります。
現在、mv1形式のモデルの髪の毛を物理演算させようとしています。
(理想はMMDの髪の毛部分のような動き)
そこで以前から使用していたBulletと組み合わせて再現しようとしたのですが、どうも上手く表現出来ません。
以下の様なコードを書いてはみたものの、見事に撃沈状態であります。
宜しければ改善方法等をご教授下さい。
// 剛体作成関数
btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape){
bool isDynamic = (mass != 0.f);
btVector3 localInertia(0,0,0);
if (isDynamic)
shape->calculateLocalInertia(mass,localInertia);
btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia);
btRigidBody* body = new btRigidBody(rbInfo);
return body;
}
//コンストラクタ内
m_HairShapes = new btSphereShape ( btScalar( 0.1f ) ) ;
float mass = 0.1f ;
btTransform trans;
trans.setIdentity();
trans.setOrigin( btVector3(0,70,0) ) ;
m_HairRigidBody[0] = localCreateRigidBody( 0 ,trans, m_HairShapes ) ;
trans.setIdentity();
trans.setOrigin( btVector3(0,70,0) ) ;
m_HairRigidBody[1] = localCreateRigidBody( mass , trans , m_HairShapes ) ;
btTransform frameInA, frameInB;
frameInA = btTransform::getIdentity();
frameInB = btTransform::getIdentity();
frameInA.setOrigin(btVector3( 0 , -0.15f , 0 ) ) ;
frameInB.setOrigin(btVector3( 0 , 0.15f , 0 ) ) ;
btGeneric6DofConstraint* slider = new btGeneric6DofConstraint(*m_HairRigidBody[0], *m_HairRigidBody[1],frameInA,frameInB,true);
slider->setLinearLowerLimit(btVector3( 0 , 0 , 0 ));
slider->setLinearUpperLimit(btVector3( 0 , 0 , 0 ));
slider->setAngularLowerLimit(btVector3( -0.3f , 0 , -0.3f) ) ;
slider->setAngularUpperLimit(btVector3( 0.3f , 0 , 0.3f ) ) ;
this->cl_ObjectManage->GetDynaWorld()->addConstraint( slider ) ;
this->cl_ObjectManage->AddRightBody( m_HairRigidBody[0] ) ;
this->cl_ObjectManage->AddRightBody( m_HairRigidBody[1] ) ;
m_HairRigidBody[0]->setCollisionFlags(m_HairRigidBody[0]->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT );
m_HairRigidBody[0]->setActivationState( DISABLE_DEACTIVATION );
//以下毎ループ内
MV1ResetFrameUserLocalMatrix( this->m_Model , 0 ) ;
MV1ResetFrameUserLocalMatrix( this->m_Model , 1 ) ;
// 剛体[0]を0番フレームの位置へ
{
VECTOR v = MV1GetFramePosition( this->m_Model , 0 ) ;
btTransform t ;
this->m_HairRigidBody[0]->getMotionState()->getWorldTransform( t );
t.setOrigin( btVector3( v.x , v.y , v.z ) ) ;
this->m_HairRigidBody[0]->getMotionState()->setWorldTransform( t ) ;
}
// 1番フレームを剛体[1]の状態に合わせる
{
btTransform trans;
MATRIX* m = &MGetIdent() ;
MATRIX a ;
this->m_HairRigidBody[1]->getMotionState()->getWorldTransform( trans ) ;
trans.getOpenGLMatrix( ( btScalar* )m ) ;
a.m[ 0 ][ 0 ] = m->m[ 0 ][ 0 ] ;
a.m[ 0 ][ 1 ] = m->m[ 1 ][ 0 ] ;
a.m[ 0 ][ 2 ] = m->m[ 2 ][ 0 ] ;
a.m[ 0 ][ 3 ] = 0.0f ;
a.m[ 1 ][ 0 ] = m->m[ 0 ][ 1 ] ;
a.m[ 1 ][ 1 ] = m->m[ 1 ][ 1 ] ;
a.m[ 1 ][ 2 ] = m->m[ 2 ][ 1 ] ;
a.m[ 1 ][ 3 ] = 0.0f ;
a.m[ 2 ][ 0 ] = m->m[ 0 ][ 2 ] ;
a.m[ 2 ][ 1 ] = m->m[ 1 ][ 2 ] ;
a.m[ 2 ][ 2 ] = m->m[ 2 ][ 2 ] ;
a.m[ 2 ][ 3 ] = 0.0f ;
a.m[ 3 ][ 0 ] = m->m[ 0 ][ 3 ] ;
a.m[ 3 ][ 1 ] = m->m[ 1 ][ 3 ] ;
a.m[ 3 ][ 2 ] = m->m[ 2 ][ 3 ] ;
a.m[ 3 ][ 3 ] = 1.0f ;
MV1SetFrameUserLocalMatrix( this->m_Model , 1 , a ) ;
}