Ⅰ Java怎麼使用物理引擎
插件:插件是可獨立完成某個或一系列功能的模塊.通常插件由宿主程序載入,不能獨立運行.宿主:宿主是承載插件運行的環境,為插件提供基本服務.通常插件由宿主程序管理和控制.插件式:通常是由開發人員編寫宿主程序,並預先定義好系統提供基本服務介面和插件介面.然後由其他開發人員根據系統插件介面編寫插件功能.通常插件以一個獨立功能模塊的形式出現.對於宿主程序來說並不知道插件的具體功能,通常宿主啟動時檢索插件信息,並根據預定的插件介面裝載插件.
Ⅱ adams怎麼讓物體左右運動
Adams可以通過設置運埋梁動模型和控制器來實現物含液虧體的左右運動。具體步驟如下:1. 在Adams中創建一個運動談神模型;2. 在運動模型中添加物體;3. 設置物體的運動軌跡;4. 設置控制器;5. 運行模擬,查看物體的運動情況。
Ⅲ 3D物理引擎與2D物理引擎使用時的 不同碰撞函數的調用有什麼不一樣
3D物理引擎多了一個維度。
2D和3D物理引擎兩者在使用上大體相似,主要區別是3D物理引擎比2D物理引擎多了一個維度。物理引擎是游戲設計中最為重要的步驟,主要包含剛體、碰撞、物理材質以及關節運動等。
游戲中物理引擎的作用是模擬當有外力作用到對象上時對象間的相互影響,比如賽車游戲中,駕駛員駕駛賽車和牆體發生碰撞,進而出現被反彈的效果。物理引擎在這里用來模擬真實的碰撞後效果。通過物理引擎,實現這些物體之間相互影響的效果是相當簡單的。
Ⅳ Java如何使用物理引擎
那個是計算機術語
電子游戲裡面會有很多的畫面,比如你說的使命召喚,會有很多人拿著槍互相射擊的畫面。這些畫面如果需要顯示出來,需要進行物理運算和貼圖運算。物理運算的內容包括子彈的彈道,人物的動作,塵土的飛揚,車輛的運轉……而貼圖則主要負責每個物體的顏色,細節,形狀
我們的機器,其中顯卡的部分負責貼圖運算,而CPU負責物理運算。那麼CPU進行物理運算的時候需要遵循一定的法則。簡而言之,這些法則就是游戲設計人員事先設定好的運算規則,可以稱之為物理引擎。
Ⅳ cocos2d中封裝的bullet 3d物理引擎怎麼用
1. Sprite3DBasicTest Sprite3D 兩種基本創建方式 (1). 直接使用一個帶有素材的obj (3dmax對象) Sprite3D::create("sprite3dTest/scene01.obj"); (2). 使用不帶素材的對象,自和察中己設置素材喚山 auto sprite = Sprite3D::create("Sprite3DTest/boss1.ob。沒盯
Ⅵ 如何使用Bullet物理引擎 碰撞檢測
Bullet教程: Hello World 實例
更多信息請關注 物理引擎中文社區http://www.physicsengine.org
歡迎加qq群 52821727 討論更多關於Bullet的東西
這篇文章里我們將盡可能簡單的向你展示怎麼使用Bullet, 怎樣初始化Bullet, 設置一個動力學世界, 還有一個球落向地表 這個對鑒別你的build是否成功非常有用並且也能夠讓你快速的學習到Bullet的API. 首先,我們假設你的Bullet已經正確安裝並且正確設置了Bullet的include路徑(例如. /usr/local/include/bullet) 確保能連接到正確的lib. 否則請參閱Installation安裝. 如果你用的是gcc來編譯,請確保你的靜態庫反序,就是說. dynamics, collision, math.
初始化程序
以一個標準的hello world程序開始:
[cpp] view plain
#include <iostream>
int main ()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
創建世界
現在我們要添加一個子彈(Bullet)模擬. 首先寫入以下語句:
#include <btBulletDynamicsCommon.h>
我們想把btDiscreteDynamicsWorld 實例化但是在做此之前我們還需要解決一些其他事情. 對於一個「hello world」例子來說它太復雜我們並不需要. 但是,為了能更符合我們自己的工程, 他們可以用來微調(fine-tuning)模擬環境.
我們需要指出使用什麼樣的 Broadphase algorithm(寬相演算法). 選擇什麼樣的泛型演算法很總要,如果有許多剛體在繪制場景里, since it has to somehow check every pair which when implemented naively(天真) is an O(n^2) problem.
寬相(broadphase)使用 傳統的近似物體形狀並且被稱之為代理.我們需要提前告訴子彈最大的代理數, 所以才能很好的分配內存避免浪費. 下面就是世界裡任何時候的最大剛體數.
int maxProxies = 1024;
一些 broadphases 使用特殊的結構要求世界的尺度提前被告知, 就像我們現在遇到的情況一樣. 該broadphase可能開始嚴重故障,如果離開這個物體體積. 因為 the AxisSweep broadphase quantizes 空間基於我們使用的整個空間的大小, 您想這差不多等於你的世界.
使它小於你的世界將導致重大問題, 使它大於你的世界將導致低劣的性能.這是你程序調整的一個簡單部分, 所以為了確保數字的正確多花點時間也不防.
在這個例子中,世界從起點開始延伸10公里遠。
[cpp] view plain
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
這個broadphase是我們將要使用的, 這個執行的是掃描和裁剪, 這里可以看到更多解釋Broadphase .
[cpp] view plain
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
該broadphase是一個極好的空間以消除不應碰撞的成隊物體. 這是為了提高運行效率.
您可以使用碰撞調度注冊一個回調,過濾器重置broadphase代理,使碰撞系統不處理系統的其它無用部分
. 更多信息請看 Collision Things.
碰撞配置可以讓你微調演算法用於全部(而不是不是broadphase )碰撞檢測。這個方面現在還屬於研究階段
[cpp] view plain
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
我們還需要一個"solver". 這是什麼原因導致物體進行互動得當,考慮到重力,游戲邏輯等的影響,碰撞,會被制約。
它工作的很好,只要你不把它推向極端,對於在任何高性能模擬都有瓶頸有一些相似的可以線程模型:
[cpp] view plain
* solver = new ;
終於我們可以初始化了世界了:
[cpp] view plain
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
很明顯我們把重力方向設置成了Y軸的負方向,即Y軸是像上的
[cpp] view plain
dynamicsWorld->setGravity(btVector3(0,-10,0));
子彈的政策是「誰分配,也刪除」 記住,必須符合這樣的結果
在main()後記的刪除.
我們提供了一個通用的結果. 代碼如下:
[cpp] view plain
#include <btBulletDynamicsCommon.h>
#include <iostream>
int main () {
std::cout << "Hello World!" << std::endl;
// Build the broadphase
int maxProxies = 1024;
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
// 設置好碰撞屬性 和調度
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
// 實際上的物理模擬器
* solver = new ;
// 世界.
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
// 這里做一些你想做的事
// 作為一個好的編程習慣 做好刪除工作
delete dynamicsWorld;
delete solver;
delete dispatcher;
delete collisionConfiguration;
delete broadphase;
return 0;
}
碰撞包圍體
我們將創造一個接地平面[靜態剛體] ,和一個球體,將屬於在地上[動態剛體] 。每個剛體需要參考碰撞包圍體. 碰撞包圍體只解決碰撞檢測問題, 因此沒有質量,慣性,恢復原狀等概念. 如果您有許多代理,使用相同的碰撞形狀[例如每飛船模擬是一個5單元半徑范圍]。這是個好做法,只有一個子彈形狀的碰撞,並分享它在所有這些代理. 但是我們這里的兩個剛體形狀都不一樣,所以他們需要各自的shape.
地面通常是向上的並且里原始點1米的樣子. 地面會和遠點交叉,但子彈不允許這樣做,
因此,我們將抵消它的1米和用來彌補,當我們把剛體設置好以後。
[cpp] view plain
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
我們將讓它從天上掉下來,它是一個球體,半徑為1米.
[cpp] view plain
btCollisionShape* fallShape = new btSphereShape(1);
這里需要做碰撞形狀的清理工作.
剛體
在,我們可以添加形狀的碰撞到我們的現場,並將它們定位.
讓我們先初始化地面. 它的方向是特定的, 子彈的四元數形式 x,y,z,w . 位置在地面下一米, 將要補充一米我們不得不做的. 運動狀態在這里可以得到詳細的說明:MotionStates
[cpp] view plain
btDefaultMotionState* groundMotionState =
new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1,0)));
在第一個和最後一個參數,在下面的構造函數中是質量和地表的慣性. 由於地面是靜止的所以我們把它設置成0. 固定不動的物體,質量為0 -他是固定的.
[cpp] view plain
btRigidBody::btRigidBodyConstructionInfo
groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0));
btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
最後我們把地面加到世界中:
[cpp] view plain
dynamicsWorld->addRigidBody(groundRigidBody);
新增下跌領域非常相似。我們將其置於50米以上的地面.
[cpp] view plain
btDefaultMotionState* fallMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
由於它是動態剛體,我們將給予質量1公斤。我不記得如何計算一個球體的慣性,但是,這並不重要,因為子彈提供它的實現
[cpp] view plain
btScalar mass = 1;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
現在,我們可以建造剛體只是像以前一樣,並把它加到世界中:
[cpp] view plain
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
dynamicsWorld->addRigidBody(fallRigidBody);
一個快速的解釋btRigidBody::btRigidBodyConstructionInfo是為了; 物體的構建是通過某些參數的. 這是通過一個特殊的結構實現的。 該部分的btRigidBodyConstructionInfo被復制到物體當你建造的時候,並只用於在初始化的時候. 如果你想創建幾千個屬性一樣的物體, 你只需要建立一個btRigidBodyConstructionInfo, 並通過它創建所有的.
開始模擬
這就是有趣的開始。我們會加強模擬200倍,間隔60赫茲. 這使它有足夠的時間降落的地面上. 每一步, 我們都會列印出它離地面的高度.
這stepSimulation 在做你所期待, 不過他的介面確實很復雜. 讀Stepping The World 以獲得更多消息.
進後,我們審查的狀態下降領域.位置和方向都封裝在btTranform對象,我們摘錄下降領域的運動狀態. 我們只關心位置,我們退出變換getOrigin ( ) 。然後,我們列印y組成部分的立場載體.
[cpp] view plain
for (int i=0 ; i<300 ; i++) {
dynamicsWorld->stepSimulation(1/60.f,10);
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
}
這應該產生一個輸出看起來像這樣的東西:
sphere height: 49.9917
sphere height: 49.9833
sphere height: 49.9722
sphere height: 49.9583
sphere height: 49.9417
sphere height: 49.9222
sphere height: 49.9
...
sphere height: 1
sphere height: 1
sphere height: 1
sphere height: 1
sphere height: 1
看起來不錯迄今。如果你圖這對輸出迭代次數,你就會得到這個:
這個球體開始於地表的一米處. 這是因為取的是幾何中心並且它的半徑為1米. 這個球剛開始會有一個大的反彈然後漸漸的減緩彈起高度.
這是可以預料的實時物理引擎,但它可以盡量減少,增加頻率的模擬步驟
. 試試再說!
現在你可以把這個動態世界代入你的程序 實時繪制出這個球體. 也可以看看其他的 Collision Shapes . 試試一堆盒子 或者圓柱體然後用一個球去扔向他們.
完整代碼
[cpp] view plain
#include <iostream>
#include <btBulletDynamicsCommon.h>
int main (void)
{
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
int maxProxies = 1024;
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies);
* collisionConfiguration = new ();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
* solver = new ;
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);
dynamicsWorld->setGravity(btVector3(0,-10,0));
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);
btCollisionShape* fallShape = new btSphereShape(1);
btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1,0)));
btRigidBody::btRigidBodyConstructionInfo
groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0));
btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
dynamicsWorld->addRigidBody(groundRigidBody);
btDefaultMotionState* fallMotionState =
new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
btScalar mass = 1;
btVector3 fallInertia(0,0,0);
fallShape->calculateLocalInertia(mass,fallInertia);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
dynamicsWorld->addRigidBody(fallRigidBody);
for (int i=0 ; i<300 ; i++) {
dynamicsWorld->stepSimulation(1/60.f,10);
btTransform trans;
fallRigidBody->getMotionState()->getWorldTransform(trans);
std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
}
dynamicsWorld->removeRigidBody(fallRigidBody);
delete fallRigidBody->getMotionState();
delete fallRigidBody;
dynamicsWorld->removeRigidBody(groundRigidBody);
delete groundRigidBody->getMotionState();
delete groundRigidBody;
delete fallShape;
delete groundShape;
delete dynamicsWorld;
delete solver;
delete collisionConfiguration;
delete dispatcher;
delete broadphase;
return 0;
}
Ⅶ cocos2d-x 2.2.2版本里的物理引擎怎麼使用
cocos2d-x 2.2.2版本里的物理引擎怎麼使用
覺得我的具體經歷可以幫助題主嫌亮理解這個問題。
第一個 cocos2d-x 項目(A 項目),我姿者棗們使用的是 quick2.2.3。為什麼選擇quick,在這里有說:Cocos2d-x script language binding:Lua or Javascript?
後來,我對其進行了較多的修改(詳情見這里:zrong/quick-cocos2d-x · GitHub)。當然,所有的修改都是開源的,而且大多數修改都推送給 quick 官方庫了(詳見這里:Commits · chukong/quick-cocos2d-x · GitHub)。
基跡拆於這個修改版,我們把 A 項目完成了,但沒有進行發布。
立項 B 項目時,cocos2d-x 已經升級到 3.3beta。於是我不再使用 quick,改用 cocos2d-x 3.3 lua。原因在這里有說:從 quick 轉向 cocos2d-x 3.3 lua。
Ⅷ 物理引擎的作用是什麼呢
物理引擎使用對象屬性(動量、扭矩或者彈性)來模擬剛體行為,這不僅可以得到更加真實的結果,對於開發人員來說也比編寫行為腳本要更加容易掌握。好的物理引擎允許有復雜的機械裝置,像球形關節、輪子、氣缸或者鉸鏈。有些也支持非剛性體的物理屬性,比如流體。物理引擎可以從另外的廠商購買,而一些游戲開發系統具備完整的物理引擎。
但是要注意,雖然有的系統在其特性列表中說他們有物理引擎,但其實是一些簡單的加速和碰撞檢測屬性而已。當NVIDIA宣布正式收購Ageia及該公司的PhysX物理軟硬體組件後,所有人都在期待,期待著NVIDIA會推出新的有關物理運算的東西出來。果不其然,最近當NVIDIA發布Forceware 177.79驅動後,意味著GeForce 8/9和GT200系列的GPU都支持PhysX引擎。這是因為NVIDIA將PhysX引擎集成到CUDA架構的物理運算中。這樣,顯卡就能自動進行物理加速運算。當然,PhysX在游戲上的運用僅僅是物理引擎眾多運用的一方面,在整個CUDA通用運算領域上,都會有物理引擎的身影,比如計算天體間在相互引力的作用下,各自的運動軌跡等。
Ⅸ 使用物理引擎,怎麼控制人物是勻速移動的
as3控制角色左右移動
as3僅僅對本幀起作用,也就是說,必須在某一胡碼鍵幀上寫as3的代碼才有效,而且這一幀必須不能播放。
舉個例子:
假如舞台有6幀:
你的角色在第1幀,就必須這么寫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//先停在第一幀
gotoAndStop(1);
//添加一個按鍵的偵聽函模液數
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardhandle);
//按鍵後的處理函數
function keyboardhandle(e:KeyboardEvent):void
{
if (e.keyCode==37)
{
//這里寫左鍵移動的代碼
//比如控制的對象為mc,則mc每次移動10像褲巧素
mc.x-=10;
}
if (e.keyCode==39)
{
//這里寫右鍵移動的代碼
mc.x+=10;
}
}
有沒有重力沒有關系