トップページ > 記事閲覧
mv1形式のBulletを使った物理演算
名前:ペッパー 日時: 2013/07/18 09:17

いつもお世話になっています。 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 ) ; }
メンテ

Page: 1 |

Re: mv1形式のBulletを使った物理演算 ( No.1 )
名前:管理人 日時:2013/07/21 09:47

すみません、Bullet の使い方は殆ど分からないのでお答えすることができません 人様のソースを見よう見真似で実装したPMDファイルの Bullet 対応のソースは DxUseCLibPhysics.cpp や DxModel.cpp にありますので、よろしければダウンロードページから DXライブラリのソースをダウンロードしてご覧になってみてください ( DxModel.cpp の中にある NS_MV1PhysicsCalculation という関数でリアルタイム物理の状態を更新しています DXライブラリ内部の関数を使用しているのでそのままは使えませんが、参考にはなるかもしれません )
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存