Can i dynamicly move a TriMesh?
Sometimes you may wish to move portions of static game world for creating elevators, trains and other special animations.
If you want to move an immobile object (mass = 0), then you need to:
- set it's velocity using NewtonBodySetVelocity()
- every frame, manually use NewtonBodySetMatrix() to move the body's position according to its velocity
- every frame, wake up all objects within this body's AABB using NewtonWorldForEachBodyInAABBDo() or NewtonWorldGetFirst/NextBody() and NewtonBodySetSleepState()
(psuedo-code) game loop { if body has 0 mass and NewtonBodyGetVelocity(body) != vec3(0, 0, 0) mat4 position = NewtonBodyGetMatrix(body) position.translate(NewtonBodyGetVelocity(body) * deltaTime) NewtonBodySetMatrix(body, position) vec3 min, max = NewtonCollisionCalculateAABB(body.collision, position) for each body in AABB(min, max) do // can be done via NewtonWorldForEachBodyInAABBDo(), for example NewtonBodySetSleepState(body, 0) }
Now dynamic objects will react properly to any immobile mesh that is 'manually' moving (even if it's a tree collision). You can also use this technique to set the position of a body (not via velocity, forces or joints) and make other bodies react properly - simply move it as such, and set the velocity to the vector (newPosition - oldPosition). Then perform the rest of the operations above.
If it's not an immobile object, simply use NewtonBodySetVelocity() or NewtonBodyAddImpulse() to give the body a velocity.
This tip is for Newton 2.0
Back to the FAQ
Source tip by agi_shi on forums
http://newtondynamics.com/forum/viewtopic.php?p=35089#p35089