bullet3 物理引擎 初識之 App_HelloWorld
Home of Bullet and PyBullet:
physics simulation for games, visual effects, robotics and reinforcement learning.
使用:
README.md 中已描述:
Windows
Click on build_visual_studio_vr_pybullet_double.bat and open build3/vs2010/0MySolution.sln
When asked, convert the projects to a newer version of Visual Studio.
If you installed Python in the C:\ root directory, the batch file should find it automatically.
Otherwise, edit this batch file to choose where Python include/lib directories are located.
用VS2015開啟也可以, 然後編譯執行. 沒太多可述說的
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
///-----includes_start-----
#include "btBulletDynamicsCommon.h"
#include <stdio.h>
/// This is a Hello World program for running a basic Bullet physics simulation
// Bullet模擬剛體動畫的一般流程為:
// 初始化場景資料->設定場景的重力等引數->建立邊界碰撞體->建立碰撞體->迭代模擬場景資料(計算一幀並輸出資料)
int main(int argc, char** argv)
{
///-----includes_end-----
///-----initialization_start-----
// 建立碰撞配置物件以及碰撞排程器物件,使我們可以再各個階段嘗試不同的演算法組合,目的是使用不同的演算法和測試相同的碰撞
// 碰撞配置
///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration.
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
// 碰撞排程
///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
// btDbvtBroadphase用來執行快速碰撞檢測 目的是儘量的剔除沒有相互作用的物件對
///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep.
btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
// 實際上的物理模擬器
// 建立解算器,用於求解約束方程。得到物體在重力等作用下的最終位置的
///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
// 獨立場景動態世界
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(
dispatcher, overlappingPairCache, solver, collisionConfiguration);
dynamicsWorld->setGravity(btVector3(0, -10, 0)); // 設定重力加速度 Y向下
///-----initialization_end-----
//keep track of the shapes, we release memory at exit.
//make sure to re-use collision shapes among rigid bodies whenever possible!
btAlignedObjectArray<btCollisionShape*> collisionShapes;
///create a few basic rigid bodies
//建立一個地面,並加入到場景世界中
//the ground is a cube of side 100 at position y = -56.
//the sphere will hit it at y = -6, with center at -5
{
btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.), btScalar(50.), btScalar(50.))); // 長方體
collisionShapes.push_back(groundShape);
btTransform groundTransform;
groundTransform.setIdentity();
groundTransform.setOrigin(btVector3(0, -56, 0)); // 設定原點位置
btScalar mass(0.); // 質量
//rigidbody is dynamic if and only if mass is non zero, otherwise static
bool isDynamic = (mass != 0.f);
btVector3 localInertia(0, 0, 0); // 慣性
if (isDynamic)
groundShape->calculateLocalInertia(mass, localInertia); //通過質量,這個函式計算出運動物體的慣性
// 運動狀態
//using motionstate is optional, it provides interpolation capabilities, and only synchronizes 'active' objects
btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform);
// 剛體構造資訊
btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, groundShape, localInertia);
// 剛體
btRigidBody* body = new btRigidBody(rbInfo);
// 將剛體新增至動態世界中
//add the body to the dynamics world
dynamicsWorld->addRigidBody(body);
}
{
//建立一個球體,並加入到場景世界中
//create a dynamic rigidbody
//btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1));
btCollisionShape* colShape = new btSphereShape(btScalar(1.)); // 球體 半徑為1
collisionShapes.push_back(colShape);
/// Create Dynamic Objects
btTransform startTransform;
startTransform.setIdentity();
startTransform.setOrigin(btVector3(2, 10, 0));
btScalar mass(1.f); // 質量
//rigidbody is dynamic if and only if mass is non zero, otherwise static
bool isDynamic = (mass != 0.f);
btVector3 localInertia(0, 0, 0); // 慣性
if (isDynamic)
colShape->calculateLocalInertia(mass, localInertia); //通過質量,這個函式計算出運動物體的慣性
//using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects
btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, colShape, localInertia);
btRigidBody* body = new btRigidBody(rbInfo);
dynamicsWorld->addRigidBody(body);
}
/// Do some simulation
int i = 0;
// 步進模擬
///-----stepsimulation_start-----
for (i = 0; i < 150; i++)
{
dynamicsWorld->stepSimulation(1.f / 5.f, 10); // 模擬運動 每次進行物理模擬運算的時間間隔 每次能響應的最大step數
//print positions of all objects
for (int j = dynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
{
btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j];
btRigidBody* body = btRigidBody::upcast(obj);
btTransform trans;
if (body && body->getMotionState())
{
body->getMotionState()->getWorldTransform(trans);
}
else
{
trans = obj->getWorldTransform();
}
printf("world pos object %d = %f,%f,%f\n", j,
float(trans.getOrigin().getX()), float(trans.getOrigin().getY()), float(trans.getOrigin().getZ()));
}
printf(" \n");
}
///-----stepsimulation_end-----
//cleanup in the reverse order of creation/initialization
///-----cleanup_start-----
//清理動態世界裡的剛體
//remove the rigidbodies from the dynamics world and delete them
for (i = dynamicsWorld->getNumCollisionObjects() - 1; i >= 0; i--)
{
btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i];
btRigidBody* body = btRigidBody::upcast(obj);
if (body && body->getMotionState())
{
delete body->getMotionState();
}
dynamicsWorld->removeCollisionObject(obj);
delete obj;
}
//清理碰撞形狀
//delete collision shapes
for (int j = 0; j < collisionShapes.size(); j++)
{
btCollisionShape* shape = collisionShapes[j];
collisionShapes[j] = 0;
delete shape;
}
//清理動態世界
//delete dynamics world
delete dynamicsWorld;
//清理求解器
//delete solver
delete solver;
//清理粗測階段
//delete broadphase
delete overlappingPairCache;
//清理排程
//delete dispatcher
delete dispatcher;
delete collisionConfiguration;
//next line is optional: it will be cleared by the destructor when the array goes out of scope
collisionShapes.clear();
}
相關推薦
bullet3 物理引擎 初識之 App_HelloWorld
Home of Bullet and PyBullet: physics simulation for games, visual effects, robotics and reinforcement learning. 使用: REA
unity物理引擎中之關節和布料
關節 關節分類 鉸鏈關節 固定關節 彈性關節 角色關節 可配置關節 鉸鏈關節(Hinge Joint) • 鉸鏈關節 將兩個剛體 (Rigidbody) 組合在一起,從而將其約束為如同通過鉸鏈連線一樣進行移動。它十分適合門,也可用於對鏈條
CocosCreator之KUOKUO帶你做個基於物理引擎的繩子關節的duang~
本次引擎2.0.5 編輯工具VSCode 目標:基於物理引擎的繩子關節的duang~ 來吧,讓我們走進物理世界! 新建工程: 單色精靈背景,單色精靈地面。 然後給ground加剛體,加個物理碰撞盒子。 設定為靜態。 好了,我們弄個r
CocosCreator之KUOKUO帶你做個基於物理引擎的輪子小車的duang~
本次引擎2.0.5 編輯工具VSCode 目標:基於物理引擎的輪子小車的duang~ 來吧,讓我們走進物理世界! 新建工程: 單色精靈背景,單色精靈地面。 然後給ground加剛體,加個物理碰撞盒子。 設定為靜態。 然後我們弄個車!
微信小遊戲開發之五:為three.js新增物理引擎Physijs
let THREE = require('./three/three') import Physijs from './three/physi' export default class game3d { constructor() { Physijs.scripts.worker
cocos2d-x之物理引擎box2d(2)
小滿(bill man)個人原創,歡迎轉載,轉載請註明地址,小滿(bill man)的專欄地址http://blog.csdn.net/bill_man 由於box2d的內容比較多,它也有自己的testbed例子,所以關於比較深入的box2d引擎內容,我準備單開一個專題去研
cocos2d-x box2d物理引擎深入研究 第一篇之旋轉關節詳解(b2RevoluteJoint)
對於旋轉關節場常見的包括如下: 滾輪或滾筒鏈條或懸橋(使用多個旋轉聯結器)破布娃娃的關節轉門,彈射器,槓桿建立旋轉關節 建立旋轉關節首先設定b2RevoluteJointDef屬性,然後用世界物件建立之. 然後我們看一堆關於旋轉關節的屬性。 localAnchorA - 基
three.js 之cannon.js物理引擎
今天郭先生說的是一個物理引擎,它十分小巧並且操作簡單,沒錯他就是cannon.js。這些優點都源自於他是基於js編寫的,對於js使用者來說cannon.js擁有其他物理引擎沒有的純粹性。從學習成本來看,cannon.js的學習成本比較低,對於新手來說比較友好,因為它有相對完善的api,學習cannon.js之
three.js cannon.js物理引擎之約束
今天郭先生繼續說cannon.js,主演內容就是點對點約束和2D座標轉3D座標。仍然以一個案例為例,場景由一個地面、若干網格組成的約束體和一些擁有初速度的球體組成,如下圖。線案例請點選部落格原文。 下面來說說如何使用約束來完成一個這樣的物理場景。 1. 建立three場景 這一步是基礎工作,對於有一定thr
three.js cannon.js物理引擎之Heightfield
今天郭先生說一說cannon.js物理引擎之Heightfield高度場,學過場論的朋友都知道物理學中把某個物理量在空間的一個區域內的分佈稱為場,高度場就是與高度相關的場,而cannon.js物理引擎的Heightfield的高度就是關於兩個變數的函式,可以表達為HEIGHT(i,j)。當然知不知道場論不耽誤
three.js cannon.js物理引擎之製作擁有物理特性的汽車
今天郭先生說一說使用cannon.js的車輛輔助類讓我們的汽車模型擁有物理特性。效果圖如下,線上案例請點選部落格原文。 下面我們說一下今天要使用的兩個類,並簡單的看看他們的物理意義 1. RaycastVehicle類 這是車輛輔助類,將光線從車輪位置投射到地面並施加力。它決定車的位置,角度,質量等資訊。下
three.js cannon.js物理引擎之ConvexPolyhedron多邊形
年後第一天上班,郭先生來說一說cannon.js的ConvexPolyhedron(多邊形),cannon.js是一個物理引擎,內部通過連續的計算得到各個時間點的資料的狀態,three.js的模型可以定時的應用這些狀態來達到運動的效果,但是在應用的時候cannon資料模型和three模型一般都是不同的(而且多
three.js cannon.js物理引擎之約束(二)
今天郭先生繼續講cannon.js的物理約束,之前的一篇文章曾簡單的提及過PointToPointConstraint約束,那麼今天詳細的說一說cannon.js的約束和使用方法。線上案例請點選部落格原文。 1. cannon.js約束的種類 1. PointToPointConstraint點對點約束 它的
IOS開發——手勢 & 傳感器 & 物理引擎
github上 content 物理 alt img .net amp 技術分享 lan 這次思維導圖比較雜,demo已經所有上傳到github上,小編的github地址是:狂戳 先看下效果圖: 手勢畫板: 物理引擎: 傳感器: IOS開發——手
實例介紹Cocos2d-x中Box2D物理引擎:碰撞檢測
函數實現 pda creates pty blank oid rtu and 重構 在Box2D中碰撞事件通過實現b2ContactListener類函數實現,b2ContactListener是Box2D提供的抽象類,它的抽象函數:virtual void BeginC
chipmunk 物理引擎的基本概念和基本用法
num 碰撞回調 2.0 ddb mat sha print 單獨 得出 chipmunk是一個開源2D物理引擎, 項目主頁:http://code.google.com/p/chipmunk-physics/ 工作需要研究了一下,這個引擎的資料還是不多,我閱讀了
實例介紹Cocos2d-x中Box2D物理引擎:HelloBox2D
pre all align 討論 響應 算法 站點 virtual origin 我們通過一個實例介紹一下。在Cocos2d-x 3.x中使用Box2D物理引擎的開發過程,熟悉這些API的使用。這個實例執行後的場景如圖所看到的,當場景啟動後,玩家能夠觸摸點擊屏幕,每次觸
2d物理引擎01
blue idt 不知道 速度 物理引擎 alt 坐標 obj key 我一直想做一個遊戲,但一直感覺自己水平不夠 想了想覺得不去做的話就永遠做不出來 所以有了這個博文 01 我需要一個東西來顯示,很顯然h5中canvas是很好的選擇 <!DOCTYPE html&
003-unity3d 物理引擎簡介以及示例
tco add too war 速度 blog 不同 創建 plan 一、概述 物理引擎就是模擬真實世界中物體碰撞、跌落等反應的引擎,通過ballence、憤怒的小鳥等理解。Unity3D的物理引擎使用的是Nvidia的PhysX。 物理引擎是一個計算機程序模擬
Unity2D遊戲物理引擎演示
unit 技術 引擎 inf class 圖片 unity2d info 分享 Unity2D遊戲物理引擎演示