Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mapping a vector across the y-axis if it has 4 components

Tags:

ios

scenekit

I am applying a force and a torque on an node. This is my code:

myNode?.physicsBody?.applyForce(SCNVector3Make(0, -6, 4), atPosition: SCNVector3Make(0, 1, -1), impulse: true)
myNode?.physicsBody?.applyForce(SCNVector3Make(0, -2, 10), impulse: true)
myNode?.physicsBody?.applyTorque(SCNVector4Make(4, 2, 2.5, 1.6), impulse: true)

The object now falls down and moves from left to right afterwards. I want it fall down and move from right to the left(basically a reflection of the first movement across y-axis). I figured it out that there is very little I can do about the first 2 lines of code, because the force has no x-component. The last line, applyTorque, is the one I need to manipulate. How do you map across the y-axis if the vector has 4 components? I am a little rusty with math

like image 277
potato Avatar asked Sep 12 '15 06:09

potato


3 Answers

The fuller version of the applyTorque function looks something like this:

.applyTorque(SCNVector4Make(x:, y:, z:, w:), impulse:)

So any numbers you put in the second position should be torque amounts around the y axis.

There's probably a relationship between the numbers and what they create in terms of rotational force on an object, but I've always just used trial-and-error to find what works. Sometimes it's HUGE numbers.

like image 90
Confused Avatar answered Oct 22 '22 19:10

Confused


I am assuming that the x-axis is horizontal and the y-axis is vertical and the z-axis points straight at you (see the black arrows below):

enter image description here

I found evidence that this is indeed the case in SceneKit.

If

applyTorque(SCNVector4Make(x, y, z, w), impulse: boolean)

is the correct usage, then x is the amount of counter-clockwise rotation around the x-axis (see green circle arrow), and similarly for y and z. Again, this is my best guess, and it is possible that SceneKit uses clockwise rotation. Therefore, x, y, and z together determine the axis of rotation of the torsional force.

Here is a simpler way to think of it. x, y, and z create a vector in the 3D space described above. The object will rotate counter-clockwise around this vector.

w on the other hand, is the magnitude of the torque, and has nothing to do with the axis of rotation.

Your request to "map vector across the y-axis" is actually a reflection across the yz-plane. If you think about it, what you want is to rotate the opposite direction around the y-axis (negate y) and the same for z.

So the answer should be:

myNode?.physicsBody?.applyTorque(SCNVector4Make(4, -2, -2.5, 1.6), impulse: true)
like image 25
mareoraft Avatar answered Oct 22 '22 20:10

mareoraft


According to the SceneKit documentation the SCNVector4 argument specifies the direction (x, y, z vector components) and magnitude (w vector component) of the force in newton-meters. To mirror the direction of the applied torque, all you have to do is invert the magnitude. (x, y, z, -magnitude)

like image 22
theB Avatar answered Oct 22 '22 21:10

theB