Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting an SCNPhysicsVehicle's Position

Tags:

scenekit

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.

like image 698
Pamelloes Avatar asked Jun 20 '14 01:06

Pamelloes


People also ask

What causes a vehicle to move physics?

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).

How is physics used when designing a vehicle?

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.


2 Answers

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).

like image 170
rickster Avatar answered Oct 26 '22 18:10

rickster


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

like image 20
tekodragoon Avatar answered Oct 26 '22 18:10

tekodragoon