I am working on a basic racing game using Apple's SceneKit and am running into issues simulating a car. Using the SCNPhysicsVehicle behavior, I am able to properly set up the car and drive it using the documented methods.
However, I am unable to get the car's position. It seems logical that the SCNPhysicsVehicle would move the SCNNodes that contain the chassis and the wheels as the car moves but the SCNNodes remain at their original position and orientation. Strangely enough, the chassis' SCNPhysicsBody's velocity remains accurate throughout the simulation so I can assume that the car's position is based off of the SCNPhysicsBody and not the SCNNode. Unfortunately, there is no documented method that I have found to get an SCNPhysicsBody's position.
Getting a car's position should be trivial and is essential to create a racing game but I can't seem to find any way of getting it. Any thoughts or suggestions would be appreciated.
The frictional force between the road and tire is what allows the tire to "push" off the road, thus moving the car forward (Newton's third law — the action is the pushing frictional force, the reaction is the forward movement of the car).
Physics plays an important role in car design and can be applied to almost every aspect in regard to acceleration, stopping, aerodynamics, speed, velocity and so on. Understanding and exploring each concept could take months since it is such a complex matter.
Scene Kit automatically updates the position of the node that owns an SCNPhysicsBody
based on the physics simulation, so SCNNode.position
is the right property to look for.
The catch is that there are actually two versions of that node in play. The one you typically access is called the "model" node. It reflects the target values for properties you set, even if you set those properties through an animation. The presentationNode
reflects the state of the node currently being rendered — if an animation is in progress, the node's properties have intermediate values, not the target values of the animation.
Actions, physics, constraints, and any scene graph changes you make inside update/render loop methods directly target the "presentation" version of your scene graph. So, to read node properties that have been set by the physics simulation, get the presentationNode
for the node you're interested in (the node that owns the vehicle's chassisBody
physics body), then read the presentation node's position
(or other properties).
I have the same problem with my player node.
I move it with applyForce
(to manage collision detection).
But when i check node position after some movement, the node position has not move (presentation node is the actual position as rickster write in his answer)
I manage to update the scnNode.position with renderer loop
You have to set position of your node with the presentationNode
position.
node.position = node.presentationNode.position
Set this into renderer(_: updateAtTime)
and your node position will sync with any animation you made to the physicsBody
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With