⑴ QQ飛車,物理引擎是什麼啊
物理引擎通過為剛性物體賦予真實的物理屬性的方式來計算運動、旋轉和碰撞反映。為每個游戲使用物理引擎並不是完全必要的—簡單的「牛頓」物理(比如加速和減速)也可以在一定程度上通過編程或編寫腳本來實現。然而,當游戲需要比較復雜的物體碰撞、滾動、滑動或者彈跳的時候(比如賽車類游戲或者保齡球游戲),通過編程的方法就比較困難了。
QQ飛車用的是PhysXPhysX
是一套由NVIDIA
設計的執行復雜的物理運算的技術。NVIDIA
PhysX基於NVIDIA
CUDA,允許其用戶利用
PhysX
執行物理運算。
Physx在游戲中實現物理運算效果絕非易事。物理運算效果是一種對計算性能要求極高的環境,以一整套獨特的物理學演算法為基礎,需要大量同步運算的能力。採用支持PhysX??技術的NVIDIA®(英偉達??)GeForce®處理器是實現實時物理學特效的最佳途徑,這些特效包括塵土飛揚、令物體碎片四射的爆炸、生動逼真的人物動作以及衣服布料的自然下垂與撕裂等。PhysX技術被廣泛應用於150多個游戲中,其注冊用戶數量已超過10,000名。這項技術在索尼的Playstation
3、微軟的Xbox
360、任天堂的Wii以及個人計算機上均得到了良好的支持,把游戲推向全新的境界。
此外,NVIDIA
PhysX是一種功能強大的物理加速引擎,可在頂級PC和游戲中實現實時的物理學計算。PhysX設計用途是利用具備數百個內核的強大處理器來進行硬體加速。加上GPU超強的並行處理能力,PhysX將使物理加速處理能力呈指數倍增長並將您的游戲體驗提升至一個全新的水平,在游戲中呈現豐富多彩、身臨其境的物理學游戲環境。其中特色如下:
1、爆炸引起的煙塵和隨之產生的碎片
2、復雜、連貫的幾何學計算使人物的動作和互動更加逼真
3、其視覺效果令人嘆為觀止的全新武器
4、布紋的編織和撕裂效果非常自然
5、運動物體周圍煙霧翻騰
6、採用NVIDIA支持PhysX的GeForce處理器是實現真實物理加速效果的唯一途徑,其可縮放、復雜、逼真、高度互動的特性將徹底顛覆您的娛樂體驗。
NVIDIA將PhysX引擎集成到CUDA架構的物理運算中,這樣就可以是GeForce
8/9及GT200系列全部都支持PhysX引擎,
所有已使用PhysX技術的游戲都支持新版驅動程序,果裝有支持CUDA平台的顯卡,游戲將自動選取顯卡進行物理加速運算,仍會使用性能較慢的CPU進行運算。此外,PhysX並不只使用於游戲市場,同時亦會運用CUDA通用運算領域上,應用更廣。
無論是GPU還是CPU、PPU、Cell(PS3)都可以通過HAL翻譯層來實現軟、固質體動力(Soft
or
Rigid
Body
Dynamics)、通用碰撞偵測(Universal
Collision
Detection)、有限元素分析(Finite
Element
Analysis)、流體動力(Fluid
Dynamics)、毛發模擬(Hair
Simulation),以及更高級開發平台APEX中的更先進的布料模擬(Cloth
Simulation)、自然模擬(Natural
Motion)等在內新穎技術。
通過過CUDA通用介面,PhysX引擎將NVIDIA
GPU中的Thread
Scheler(線程管理器)模擬成Control
Engine(控制引擎CE),而Streaming
Processors來模擬Vector
Processing
Engine(矢量處理引擎,VPE),其中CE控制引擎負責任務的指派,相當於PhysX中的主管機構,而真正的物理運算任務則是由VPE矢量引擎來完成,最後通過Data
Movement
Engine(數據移動引擎DME)輸出。</SPAN></p>
⑵ 如何使用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;
}
⑶ 物理引擎和虛擬引擎是什麼東西
為每個游戲使用物理引擎並不是完全必要的——簡單的「牛頓」物理(比如加速和減速)也可以在一定程度上通過編程或編寫腳本來實現。然而,當游戲需要比較復雜的物體碰撞、滾動、滑動或者彈跳的時候(比如賽車類游戲或者保齡球游戲),通過編程的方法就比較困難了。物理引擎使用對象屬性(動量、扭矩或者彈性)來模擬剛體行為,這不僅可以得到更加真實的結果,對於開發人員來說也比編寫行為腳本要更加容易掌握。 好的物理引擎允許有復雜的機械裝置,像球形關節、輪子、氣缸或者鉸鏈。有些也支持非剛性體的物理屬性,比如流體。 物理引擎可以從另外的廠商購買,而一些游戲開發系統具備完整的物理引擎。
⑷ 怎麼製作游戲編程開發
一、游戲程序開發的工作主要包括哪些方面
游戲開發中的程序開發主要由如下幾個方面組成:
1.圖形引擎
2.聲音引擎
3.物理引擎
4.游戲引擎
5.人工智慧或游戲邏輯
6.游戲GUI界面(菜單)
7.游戲開發工具
8.支持區域網對戰的網路引擎開發
9.支持互聯網對戰的網路引擎開發
下面逐一介紹每個部分:
1.圖形引擎主要包含游戲中的場景(室內或室外)管理與渲染,角色的動作管理繪制,特效管理與渲染(粒子系統,自然模擬(如水紋,植物等模擬)),光照和材質處理,LOD(LevelObjectDetail)管理等,另外還有圖形數據轉換工具開發,這些工具主要用於把美工用DCC軟體(如3DSMax,Maya,SoftXSI,SoftImage3D等)軟體製作的模型和動作數據以及用Photoshop或painter等工具製作的貼圖,轉化成游戲程序中用的資源文件。
2.聲音引擎主要包含音效(SoundEffect簡稱SE),語音(VOICE),背景音樂(Backgroundmusic簡稱BGM)的播放。SE是指那些慶早在游戲中頻繁播放,而且播放時間比較短,但要求能及時無延遲的播放,VOICE是指游戲中的語音或人聲,這部分對聲音品質要求比較高,基本上用比較高的采樣率錄制和回放聲音,但和SE一樣要求能及時無延遲的播放,SE在有的時候因為內存容量的問題,在不影響效果的前提下,可能會降低采樣率,但VOICE由於降低采樣率對效果影響比較大,所以一般VOICE不採用降低采樣率的做法。BGM是指游戲中一長段循環播放(也有不循環,只播放一次)的背景音樂,正是由於BGM的這種特性,一般游戲的背景音樂是讀盤(光碟或硬碟)來播放。另外一些高級聲音特效,如EAX,數字影渣差搏院系統(DTS5.1),數字杜比環繞等。
3.物理引擎主要包含游戲世界中的物體之間、物體和場景之間發生碰撞後的力學模如祥擬,以及發生碰撞後的物體骨骼運動的力學模擬(比較著名的物理引擎有havok公司的gamedynamicssdk,還有opensource的ODE—OpenDynamicsEngine)。
4.游戲引擎主要是把圖形引擎、聲音引擎、物理引擎整合起來,主要針對某個游戲製作一個游戲系統,其包含游戲關卡編輯器,主要用途是可以可視化的對場景進行調整,光照效果和霧化等效果調整,事件設置,道具擺放,NPC設置,另外還有角色編輯器,主要用於編輯角色的屬性和檢查動作數據的正確性。一般日本游戲公司的做法,他們會把關卡編輯器和角色編輯器直接做到游戲中,所有的參數調整都在游戲中通過調試菜單來進行編輯,所以一般他們把這部分調試菜單的功能做的很強大,同時在屏幕上實時的顯示一些重要的信息,這樣做的好處是關卡編輯器調整的效果直接就是游戲的效果,但是對於程序的重用性來說可能不是很好,比如說要用到另外一個游戲項目中就比較難,除非兩個游戲類型相同,只要把場景和角色數據換一下,還有做下一代產品也沒有問題,只要根據式樣增加調試菜單的功能就可以了。
5.人工智慧和游戲邏輯開發,這部分日本和歐美的游戲開發模式也有很大不同,在歐美游戲公司中運用腳本語言開發很普遍,所以這部分程序開發主要是用腳本語言編寫,而且腳本程序和游戲程序的耦合性很低,有單獨的編輯、編譯和調試環境,這樣比較利於游戲程序和關卡設計開發分開,同時並行開發,所以一般他們都會有專門做關卡設計的程序員崗位。而日本游戲公司腳本語言一般和游戲的耦合性比較高,一般通過一些語言的宏功能和一些編譯器的特定功能來完成一個簡單的腳本系統,所以一般這些腳本程序只能在游戲程序中進行調試,而不能在一個單獨的腳本編輯,編譯環境中進行開發。
6.游戲GUI界面(菜單),主要是指那些游戲中用戶界面設計,有做的復雜,有簡單的,做的簡單就是2DGUI界面,做的復雜有3DGUI界面。
7.游戲開發工具主要包含關卡編輯器,角色編輯器,資源打包管理,DCC軟體的插件工具等開發。
8.支持區域網對戰的網路引擎開發,主要解決區域網網路發包和延遲處理,通訊同步的問題,有同步通訊和非同步通訊兩種做法,非同步通訊用於那些對運行幀速要求比較高的游戲,同步通訊相對非同步通訊來說效率相對低,但是同步通訊的編程模型相對非同步通訊來得簡單一些。
9.支持互聯網對戰的網路引擎開發,目前大部分網游都是C/S結構的,伺服器端軟體配置管理,伺服器程序的最優化,還有游戲大廳、組隊、游戲邏輯處理、道具管理、收費系統等。另外還有一些網路系統是C/S和P2P兩種結構混合的,如XBOXLive等。
二、游戲公司中有哪些和程序員相關的崗位
程序員在游戲公司中的崗位在日本游戲公司和歐美的游戲公司有些不同,日本游戲公司中程序員的崗位主要有技術監督(Director),主程序員(MainProgrammer),程序員(Programmer),在日本游戲公司里負責游戲項目開發的程序員,一般不會專門根據工作內容劃分程序員,除了獨立的系統研究室和聲音系統製作部門(這兩個部門是比較獨立的,往往同時給好幾個項目服務),負責每個游戲項目開發的程序員,隨時都可能一人多職,比如說主程序員除了負責整個游戲系統以外,可能還要負責圖形或聲音引擎開發等,程序員除了人工智慧以外還有菜單製作等。這種情況在歐美的游戲公司比較少見,他們分工的比較細,一般有圖形程序員,聲音程序員,人工智慧或游戲關卡程序員,物理程序員,每個組中可能還會有一個Leader。
三、游戲公司一般是如何招聘程序員的
這一點,日本公司和歐美公司也有些不同。日本公司一般喜歡從一些高校中招聘一些應屆優秀畢業生,一方面比招聘有經驗的人要來的成本低,另方面新人是一張白紙,容易培養,像SEGA、KONAMI等都是按這種原則招聘員工的,所以想進入日本游戲公司,你要學好你的軟體課程。而歐美公司希望招聘進來,能馬上進入項目的開發中去,所以他們一般希望招聘有工作經驗的人,即使不是行業中,在相關行業中工作2、3年的也可以,所以想進入歐美游戲公司你的工作經歷很重要。
四、想成為一名游戲開發程序員應該具備哪些條件
我覺的一個游戲軟體程序員,最起碼的要求是熟練掌握計算機本科專業所學的知識,主要包括C語言或C語言,數據結構,編譯原理,演算法等,另外線性代數、微積分、牛頓力學在圖形和物理引擎開發方面用途也很廣泛,如果要提高的話還有必要了解硬體相關的知識如計算機體系結構、匯編語言,這些對我們學習一個新的硬體平台、編寫最優化代碼、提高自己游戲的競爭力都是非常有益的。另外,保持有恆心、不怕苦(比如說通宵加班)的心態,對游戲的熱情也是非常重要的。對於那些想進入游戲行業,但缺乏軟體開發知識的人,可以通過參加游戲開發培訓來
五、學習游戲編程有哪些好方法
現在有很多人,計算機本科畢業,學了很多軟體開發的知識,但是一旦要用到實際的項目開發時,感覺無從下手,這主要是在學校里運用知識的機會太少了。所以學習游戲編程最好的方法是能實際參與到一個好的游戲項目中和有豐富開發經驗的人一起開發游戲,可能學到很多你從書本上學不到知識和技能。但有時候你一時還沒有機會參與到一個好項目中,沒有機會進入一家好的游戲公司,但是你對游戲開發有一腔熱情,很希望學習游戲開發的技能,那你就應該去參加專門的游戲開發培訓,因為游戲開發培訓班中的老師都是一些有豐富開發經驗的老師,一般都有五年豐富的項目開發經驗,聽他們的課,實際上就是在和他一起分享這么多年的開發經驗,另外游戲開發培訓課程中會專門設計一些項目和課題,它們本身就是可以直接運用游戲開發中,這樣你可以不進入著名的游戲公司,但可以學到這些公司中一些常用的開發技能。另外還有一種方法經濟實惠的方法,參加一些網上志願者的開源項目,這些項目從品質來說有好有壞,選擇一個好的項目非常重要,另外他們中間本身有許多是業內人士,本來你要進入他們公司,才能學習到他們的經驗,但是通過開源項目,你就有向他們學習的機會了,說不定哪一天,你就進入一家知名的游戲公司了,不過目前開源的完整游戲項目好的不多,到是在圖形引擎和物理引擎方面有一些很不錯的開源項目,但要加入進去的話,你的基礎一定要好啊,有些開源的團隊也不是隨便什麼人就能加入的。
⑸ 物理引擎是前端還是後端
物理引擎是前端,物理引擎是一個計算機程序,使用質量、速度、摩擦力和空氣阻力等變數,模擬了一個近似真實的物理系統,為剛性物體賦予真實的物理效果,比如重力、旋轉和碰撞等效果,讓物體的行為表現的更加趨向真實。
物理引擎通過為剛性物體賦予真實的物理屬性的方式來計算運動、旋轉和碰撞反映。為每個游戲使用物理引擎並不是完全必要的—簡單的「牛頓」物理也可以在一定程度上通過編程或編寫腳本來實現。
物理引擎可以從另外的廠商購買,而一些游戲開發系統具備完整的物理引擎。但是要注意,雖然有的系統在其特性列表中說他們有物理引擎,但其實是一些簡單的加速和碰撞檢測屬性而已。
流體
流體運動更多的則是展現水從水管內噴出,水沖擊到物體後,物體的表現,比如木箱被沖翻。而那些被沖翻的木箱翻倒的方向每次都各不相同,又比如在一個NⅥDIA Logo形狀的玻璃容器中,用滑鼠來控制玻璃容器的位置,讓容器里的液體流動。
以上內容參考網路-物理引擎