Физическое моделирование реалистичного двуногого скелета - PullRequest
2 голосов
/ 14 мая 2011

Я хочу использовать физику пули или подобный физический двигатель, чтобы создать реалистичное моделирование скелета человеческого тела с двумя ногами. То есть создайте симуляцию «тела» из круглой массы поверх двух «ножек», где каждая ножка состоит из 3 сплошных частей, соединенных через 3 сустава, и каждый сустав имеет некоторые степени свободы и ограниченный диапазон движений в каждое направление, подобное человеческому бедру, колену и лодыжке.

Я стремлюсь к реалистичной модели, и, следовательно, она будет «стоять» только в том случае, если все суставы будут сбалансированы правильно, и в противном случае она упадет.

Любые указания, предложения или указатели на существующие учебники или ресурсы приветствуются! Это похоже на огромную работу, выполняемую с нуля ...

Ответы [ 4 ]

6 голосов
/ 28 марта 2014

Ознакомьтесь с проектом OpenSim (opensim.stanford.edu), который активно используется сообществом биомехаников для изучения движений человека, например, в клинических приложениях. В OpenSim модели человека часто приводятся в действие мышцами, а не просто крутящими моментами в суставах.

OpenSim построен поверх многотельной динамической библиотеки Simbody. Посмотрите на этот пример из Simbody, чтобы взяться за дело с моделью гуманоида: https://github.com/simbody/simbody/blob/master/Simbody/examples/JaredsDude.cpp.

4 голосов
/ 12 июля 2011

Я сейчас работаю над похожим кодом. Мой подход - использовать демо Bullet Physics Rag Doll в качестве отправной точки. У этого есть тряпичная кукла с частями тела, связанными суставами.

Затем я использую демонстрацию динамического управления Bullet Physics, чтобы научиться сгибать суставы. Сложной частью в данный момент является настройка всех параметров.

Я предлагаю вам научиться создавать два твердых тела, связанных ограничением, а затем активировать двигатель ограничения, чтобы согнуть соединение.

Ниже приведен код, с которым я работаю, чтобы узнать, как работают жесткие тела и ограничения в физике пуль. Код создает два блока, связанных шарнирным ограничением. Функция обновления медленно изгибает шарнирное ограничение с течением времени.

Теперь, когда я получил это, я вернусь к Тряпичной Кукле и отрегулирую суставы.

class Simple
{
private:
    btScalar targetAngle;

    btCollisionShape* alphaCollisionShape;
    btCollisionShape* bravoCollisionShape;
    btRigidBody* alphaRigidBody;
    btRigidBody* bravoRigidBody;
    btHingeConstraint* hingeConstraint;

    btDynamicsWorld* dynamicsWorld;

public:
    ~Simple( void )
    {
    }

    btRigidBody* createRigidBody( btCollisionShape* collisionShape, 
                  btScalar mass, 
                  const btTransform& transform ) const
    {
    // calculate inertia
    btVector3 localInertia( 0.0f, 0.0f, 0.0f );
    collisionShape->calculateLocalInertia( mass, localInertia );    

    // create motion state
    btDefaultMotionState* defaultMotionState 
        = new btDefaultMotionState( transform );

    // create rigid body
    btRigidBody::btRigidBodyConstructionInfo rigidBodyConstructionInfo( 
        mass, defaultMotionState, collisionShape, localInertia );
    btRigidBody* rigidBody = new btRigidBody( rigidBodyConstructionInfo );      

    return rigidBody;
    }

    void Init( btDynamicsWorld* dynamicsWorld )
    {
    this->targetAngle = 0.0f;

    this->dynamicsWorld = dynamicsWorld;

    // create collision shapes
    const btVector3 alphaBoxHalfExtents( 0.5f, 0.5f, 0.5f );
    alphaCollisionShape = new btBoxShape( alphaBoxHalfExtents );

    //
    const btVector3 bravoBoxHalfExtents( 0.5f, 0.5f, 0.5f );
    bravoCollisionShape = new btBoxShape( bravoBoxHalfExtents );

    // create alpha rigid body
    const btScalar alphaMass = 10.0f;
    btTransform alphaTransform;
    alphaTransform.setIdentity();
    const btVector3 alphaOrigin( 54.0f, 0.5f, 50.0f );  
    alphaTransform.setOrigin( alphaOrigin );
    alphaRigidBody = createRigidBody( alphaCollisionShape, alphaMass, alphaTransform );
    dynamicsWorld->addRigidBody( alphaRigidBody );

    // create bravo rigid body
    const btScalar bravoMass = 1.0f;
    btTransform bravoTransform;
    bravoTransform.setIdentity();
    const btVector3 bravoOrigin( 56.0f, 0.5f, 50.0f );  
    bravoTransform.setOrigin( bravoOrigin );
    bravoRigidBody = createRigidBody( bravoCollisionShape, bravoMass, bravoTransform );
    dynamicsWorld->addRigidBody( bravoRigidBody );

    // create a constraint
    const btVector3 pivotInA( 1.0f, 0.0f, 0.0f );   
    const btVector3 pivotInB( -1.0f, 0.0f, 0.0f );
    btVector3 axisInA( 0.0f, 1.0f, 0.0f );
    btVector3 axisInB( 0.0f, 1.0f, 0.0f );
    bool useReferenceFrameA = false;
    hingeConstraint = new btHingeConstraint( 
        *alphaRigidBody,
        *bravoRigidBody,
        pivotInA,
        pivotInB,
        axisInA,
        axisInB,
        useReferenceFrameA );

    // set constraint limit
    const btScalar low = -M_PI;
    const btScalar high = M_PI;
    hingeConstraint->setLimit( low, high );

    // add constraint to the world
    const bool isDisableCollisionsBetweenLinkedBodies = false;
    dynamicsWorld->addConstraint( hingeConstraint, 
                      isDisableCollisionsBetweenLinkedBodies );
    }

    void Update( float deltaTime )
    {
    alphaRigidBody->activate();
    bravoRigidBody->activate();

    bool isEnableMotor = true;
    btScalar maxMotorImpulse = 1.0f; // 1.0f / 8.0f is about the minimum

    hingeConstraint->enableMotor( isEnableMotor );
    hingeConstraint->setMaxMotorImpulse( maxMotorImpulse );

    targetAngle += 0.1f * deltaTime;
    hingeConstraint->setMotorTarget( targetAngle, deltaTime );  
    }

};
1 голос
/ 08 декабря 2011

Только что найдено «Компьютерное моделирование исследования человеческой локомоции с трехмерной нейро-мышечно-скелетной моделью всего тела», выполненное Hase & Yamazaki (2002), в котором

модель, имеющаябыла предложена трехмерная структура всего тела и состоящая из обоих нейронов системы и опорно-двигательного аппарата, чтобы точно имитировать движения при ходьбе человека.Динамика человеческого тела была представлена ​​системой 14 жестких связей и 60 мышечными моделями

0 голосов
/ 14 мая 2011

Делать с нуля будет сложно, без сомнения.Я не знаю, какова ваша цель.Но вам не нужно переделывать колесо.Вы смотрели на Unreal Engine ?Вы можете найти что-то, чтобы использовать там снова.Многие игры построены на вершине этого движка.

...