Bullet Game Physics изменение позиции и ориентации физического тела

Не буду долго размусоливать. Приведу сразу код:

void setTransform( btRigidBody * body, const btVector3 & position, const btQuaternion & rotation )
{
    // Матрица транформации
    btTransform transform;
    transform.setIdentity();
    
    // Заполним матрицу
    transform.setOrigin(position);
    transform.setRotation(rotation);

    // Применим матрицу к телу
    body->setWorldTransform(transform);

    // Важный этап: обнулим линейную и угловую скорости
    body->setLinearVelocity(btVector3(0, 0, 0));
    body->setAngularVelocity(btVector3(0, 0, 0));
}

Для чего требуется обнуление скоростей? Догадайтесь сами.

Используем OgreBullet в своем проекте с помощью CMake

В нашей системе сборки все сторонние библиотеки компилируются вместе с проектом, поэтому стандартное FIND_PACKAGE нам не подходит. Значит, CMakeLists.txt из сборки OgreBullet тоже идет лесом. Поэтому приходится извращаться на свой лад.

CMakeLists.txt

# Название проекта
project( OgreBullet )

# Разделяем исходники для двух precompiled headers
file( GLOB_RECURSE OGRE_BULLET_COLLISIONS Collisions/*.cpp )
file( GLOB_RECURSE OGRE_BULLET_DYNAMICS Dynamics/*.cpp )

# Папки для поиска #include
include_directories(
    ${GLOBAL_INCLUDE_DIR}/Ogre
    ${GLOBAL_INCLUDE_DIR}/OgreBullet/Collisions
    ${GLOBAL_INCLUDE_DIR}/OgreBullet/Dynamics
    ${GLOBAL_LIB_DIR}/Bullet
    ${GLOBAL_LIB_DIR}/Bullet/BulletConvexDecomposition
    ${GLOBAL_LIB_DIR}/Bullet )

# Определяем макрос для использования precompiled headers
macro(use_precompiled_header SRC_LIST HDR_FILE SRC_FILE)
    # Выделяем имя заголовка без пути
    get_filename_component(PCH_HEADER ${HDR_FILE} NAME)
    # Выделям имя заголовка без расширения и пути
    get_filename_component(PCH_BINARY ${HDR_FILE} NAME_WE)
    # Полный путь к созданному pch
    set(PCH_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${PCH_BINARY}.pch")

    if (MSVC)
        # Для precompiled.cpp создаем pch, указывая файл (OBJECT_OUTPUTS), который создается в результате комманды 
        set_source_files_properties( ${SRC_FILE} PROPERTIES
            COMPILE_FLAGS "/Yc${PCH_HEADER} /Fp${PCH_BINARY}"
            OBJECT_OUTPUTS "${PCH_BINARY}" )
        # Для каждого исходника в списке, задаем зависимость от precompiled.pch и указываем использовать его параметром "/Yu"
        foreach( SOURCE ${SRC_LIST} )
            set_source_files_properties( ${SOURCE} PROPERTIES 
                COMPILE_FLAGS "/Yu${PCH_HEADER}" 
                OBJECT_DEPENDS "${PCH_BINARY}" )
        endforeach( SOURCE ${SRC_LIST} )

    endif(MSVC)

endmacro(use_precompiled_header)

# Создаем precompiled header для Collisions
use_precompiled_header( OGRE_BULLET_COLLISIONS
    "${GLOBAL_INCLUDE_DIR}/OgreBullet/Collisions/OgreBulletCollisions.h" Collisions/OgreBulletCollisionsPrecompiled.cpp )

# Создаем precompiled header для Dynamics
use_precompiled_header( OGRE_BULLET_DYNAMICS
    "${GLOBAL_INCLUDE_DIR}/OgreBullet/Dynamics/OgreBulletDynamics.h" Dynamics/OgreBulletDynamicsPrecompiled.cpp )

# Объединим два списка файлов для удобства
set( OGRE_BULLET_SRC
    "${OGRE_BULLET_COLLISIONS}"
    "${OGRE_BULLET_DYNAMICS}" )

# Добавляем define для использования precompiled headers библиотекой OgreBullet
add_definitions( -D_PRECOMP )
# Profit!
add_library( ogre_bullet STATIC ${OGRE_BULLET_SRC} )

UPDATE: Окончательный вариант precompiled headers смотрим здесь.

Блог Евгения Жирнова