I need your help!
After long time, long discussion with other contributors what initial release should containi spent a lot of time polishing, fixing bullet physics feature people first would see almost 3 years ago.
Meanwhile API got limited to bere usable minimum to limit points of failure, all cool features i was showing got moved to different branch as a reference for future updates. Whole logic got moved to "shared" section to let you use all of it's feature both client and server side!
Core devs are busy, pull request is HUGE and nice to give them tested, cleaned up code they can review and because it is not a trivial task testing even limited amount of feature i need your help
If you have some free time, and minimum lua/mta experience you can download latest build of mta, client and server and test it yourself, maybe you find an issue i was unable to spot?
Download newest custom build of mta with bullet physics at https://github.com/multitheftauto/mtasa-blue/suites/6176759056/artifacts/216790429
Download test resource ( if you want ), v1: https://github.com/multitheftauto/mtasa-blue/files/8459389/tests.v1.zip it should yield a result the same as on the video below.
Documentation:
All availiable both client and server side except "physicsDrawDebug"
Bullet physics functions:
physics-shape-box physicsCreateBoxShape( float xyzSize ) -- creates cube of given dimensions, 1 means 1x1x1.
physics-shape-box physicsCreateBoxShape( float x, float y, float y ) -- creates box of given dimensions.
physics-rigid-body physicsCreateRigidBody(physics-shape, float x, float y, float z [, float rx, float ry, float rz [, table options ] ] ) -- spawns rigid body from given shape at given position and rotation with options:
-- "mass" - float between 1.0 to 1000000.0, default: 1.0
-- "localIntertia" - vector, default: 0,0,0
-- "centerOfMass" - vector, default: 0,0,0
physics-static-collision physicsCreateStaticCollision(physics-shape, float x, float y, float z [, float rx, float ry, float rz ]) -- spawns static collision at given position and rotation.
table physicsGetDebugLines( float x, float y, float z, float radius ) -- returns table of lines in format { fromX, fromY, fromZ, toX, toY, toZ, color } of all collisions in given radius - mostly used to debug server side physics.
bool physicsDrawDebug() -- draws debug collision in 500 meters radius, availiable only client side, use in onClientRender event.
bool isPhysicsElement( physics-element physicsElement ) -- isElement equivalent for physics elements
Extended functionality:
setElementPosition, setElementRotation, getElementPosition, getElementRotation -- accepting physics-world-element as first parameter
setElementVelocity, setElementAngularVelocity, getElementVelocity, getElementAngularVelocity -- accepting physics-rigid-body as first parameter
destroyElement -- accepting physics-element
Bullet physics introduces new user-data / element types ( they are not acctual elements like vehicle, player ). Used lighter version of elements to increate overall performance, simillar to how "setTimer" return timer handle, functions above return simillar handle.
New user-data/elements types and it's hierarchy:
Default, current physics settings:
Gravity: 0.0, 0.0, -10.0
Simulation step: fps independent, 10 substeps
Fixed time step: 1.0 / 60.0
Other useful informations:
1. One shape can ( should ) be used in many rigid bodies, static collisions ( in future as a part of compound shape )
2. Spawning many rigid bodies at one position will lead to high memory usage.
3. If you destroy shape, all referenced rigid bodies and static collision will be removed as well - removing static collision or rigid body never removes shape
4. Physics is frame indendent and not perfectly deterministic.
5. Yellow/White wireframe indicate active rigid body, blue are "about to sleep", green are sleeping. Sleeping rigid body behave like static collision until get hit, reactivated ( changing position, applying forces activates body, in future i have a plan to introduce function to wake up them on demand )
6. Physics elements created server or client side are not synced at all. You have to do this manually but in plan is to add build in customizable synchronization.
Pull request: https://github.com/multitheftauto/mtasa-blue/pull/1246
Read more about bullet physics: https://github.com/bulletphysics/bullet3 https://pybullet.org/wordpress/
More at mta dev discord: https://discord.gg/GNN6PRtTnu
Do you have any idea of physics applications in mta? Let us know in the comment down below!
Thanks in advance for help!
Patch 19.04.2022
- "getUserdataType" now returns exact shape type not only general shape type
- clientside draw debug no longer render debug when game minimalized.
Download newest custom build of mta with bullet physics at https://github.com/multitheftauto/mtasa-blue/suites/6176759056/artifacts/216790429