BEPUphysics adalah sebuah 3D physics engine yang didesain secara spesifik untuk XNA Framework, dapat menghandle secara efektif simulasi dan interaksi simulasi dari rigid body dan dapat digunakan dalam dalam berbagai tahap pengembangan game.
Beberapa fitur yang ditawarkan BEPUphysics :
- Support internal multithreading untuk jumlah thread yang bervariasi.
- Deteksi benturan untuk rigid body yang cepat & robust.
- Mensupport berbagai jenis obyek primitif, baik dinamik maupun kinematik, seperti : Convex hull, box, capsule, cone, cylinder, sphere, triangle, Minkowski Sum, & Wrapped Objects.
- Mensupport berbagai macam constraint, termasuk joint limit, velocity motor, & servomechanisms.
- System rule collision untuk mendefinisikan interaksi kompleks baik antar entitas maupun antar sekumpulan entitas.
Selain itu, dll BEPUphysics tersedia dalam versi untuk Windows dan XBOX360.
Untuk menggunakannya, diperlukan Visual C# 2008 dan XNA Game Studio 3.1. Pertama-tama, buatlah sebuah XNA 3.1 Windows Game project baru di Visual C#. Masukkan BEPUphysics.dll ke dalam project sebagai reference. Hal ini dilakukan dengan klik kanan di folder references di solution explorer, dan pilih “Add Reference”. Pilih tab Browse dan buka tempat di mana dll berada, lalu klik OK.

Setelah itu kita harus membuat sebuah Space object dari class dalam BEPUphysics. Semua obyek simulasi dapat di tambahkan dari sebuah instance Space.
Space space = new Space();
Buat sebuah field untuk space dan inisialisasi dalam metode LoadContent dari game. Untuk mengatasi error yang mungkin terjadi bila namespace belum direferensikan, dapat dilakukan dengan klik kanan di baris yang ditandai error, pilih Resolve, lalu pilih “using BEPUphysics”.

BEPUPhysics perlu mengetahui event “beat” dari siklus update dalam game. Dalam method Update dalam game, tambahkan baris berikut:
space.update(gameTime);
Sekarang kita akan menambahkan entitas ke dalamnya. Class Entity merepresentasikan obyek fisika umum yang menyusun space. Kita dapat membuat berbagai jenis entitas, termasuk Box, Cylinder, Sphere, Capsule, dan jenis lain yang dapat ditemui dalam namespace BEPUphysics.Entites.
Untuk menambahkan daratan/tanah, kita akan menggunakan sebuah box yang dibuat sebagai entitas kinematis. Tambahkan baris berikut ke dalam method LoadContent:
Box ground = new Box(Vector3.Zero, 30, 1, 30);
Parameter pertama adalah posisi box dan 3 parameter setelahnya adalah panjang, lebar, dan tebal. Tambahkan box tersebut ke dalam space :
space.add(ground);
Tambahkan juga beberapa cube dinamis di atasnya :
space.add(new Box(new Vector3(0, 4, 0), 1, 1, 1, 1));
space.add(new Box(new Vector3(0, 8, 0), 1, 1, 1, 1));
space.add(new Box(new Vector3(0, 12, 0), 1, 1, 1, 1));
Parameter terakhir di sini menandakan bahwa entitas ini dinamis, bukan kinematis seperti box untuk tanah/daratan tadi.
Kemudian kita perlu memberi gravitasi ke dalam simulasi space :
space.simulationSettings.motionUpdate.gravity = new Vector3(0, -9.81f, 0);
Sekarang, semua entitas dalam space telah tersimulasikan secara fisika. Property-property dari entitas tersebut akan berubah sesuai dengan kondisi entitas setelah mengalami perubahan fisika. Tugas kita sekarang adalah memvisualisasikan! Kita perlu model balok/box dengan ukuran 1x1x1. Lalu tambahkan model ini sebagai Content dari game. File model tersebut dapat didapat dalam source code tutorial ini (link di bawah). Cukup copy dan paste model tersebut ke folder Content dalam solution explorer.

Buat field dalam game untuk menampung model tersebut :
public Model cubeModel;
Dalam method LoadContent tambahkan code untuk me-load file asset dari cube model :
cubeModel = Content.Load("cube");
Sekarang kita telah memiliki obyek visual untuk merepresentasikan entitas fisika kita. Sisanya hanya tinggal menghubungkan obyek visual tersebut dengan data property entitas simulasi, dan memvisualisasikan entitas itu. Dalam method Draw kita menambahkan code yang umum digunakan untuk menggambarkan model :
// setting camera / viewer
Vector3 cameraPosition = new Vector3(0, 3, 10);
Matrix view = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up);
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 4f / 3f, .1f, 10000.0f);
Matrix[] boneTransforms = new Matrix[cubeModel.Bones.Count];
cubeModel.CopyAbsoluteBoneTransformsTo(boneTransforms);
foreach (Entity e in space.entities) {
Box box = e as Box;
if (box != null) {
foreach (ModelMesh mesh in cubeModel.Meshes) {
foreach (BasicEffect effect in mesh.Effects) {
effect.EnableDefaultLighting();
effect.World = e.worldTransform;
effect.View = view;
effect.Projection = projection;
}
mesh.Draw();
}
}
}
Sekarang compile dan jalan program, maka akan terlihat beberapa balok jatuh dan saling bertumpuk.
Source dari tutorial di atas dapat diperoleh di sini.
Info lebih lanjut, dapat diakses di www.bepu-games.com/BEPUphysics atau www.bepuphysics.com.
Beberapa video demo aplikasi yang menunjukkan kemampuan dari engine ini dapat dilihat di sini.
0 Responses to “BEPUphysics – free physics engine library untuk XNA”