Как найти положение, в которое упадет SCNNode после добавления силы/импульса?

Я пытаюсь понять, как рассчитать, куда приземлится мяч. По сути, «Мяч» устанавливается примерно на 2 фута выше, где находится рука парня.

Затем я хочу взять текущее положение мяча и применить к нему силу/импульс, который запустит его вперед. и прежде чем он приземлится, я хочу попытаться предсказать, где мяч упадет на землю. Также высота земли в сцене, вектор равен 0 во всех положениях.

Итак, в принципе возможно рассчитать, куда приземлится ваш мяч?

Ball.position = SCNVector3Make(Guy.presentationNode.position.x, Guy.presentationNode.position.y, Guy.presentationNode.position.z)          
var Currentposition = Ball.presentationNode.position
var forceApplyed = SCNVector3(x: 50.0, y: 20.0 , z: 0.0)
var LandingPiont = Currentposition + forceApplyed // Error on this line of code saying "+" cannot be applyed to CGVector
Ball.physicsBody?.applyForce(forceApplyed, atPosition: Ball.presentationNode.position, impulse: true)

person Hunter    schedule 03.09.2016    source источник
comment
Я не знаю, предлагает ли SceneKit способ сделать это. Однако, предполагая, что ваш forceApplied на самом деле является импульсом, я могу предоставить ряд уравнений для расчета горизонтального смещения. Вы должны были бы поместить их в код.   -  person bpedit    schedule 05.09.2016
comment
Было бы удивительно, если бы вы могли. Пожалуйста, опубликуйте! @бпедит   -  person Hunter    schedule 05.09.2016


Ответы (1)


Вот как можно рассчитать горизонтальное смещение, используя уравнения равномерного движения. Значение g установлено по умолчанию на 9,8 в SceneKit, что означает, что вы находитесь в системе mks (метры, килограммы, секунды).

Следующее предполагает, что вверх является положительным направлением y, а вперед, направление, в котором мяч движется по горизонтали, имеет положительное значение x. Обязательно обратите внимание на знаки движения по y. (Следующее не является кодом, хотя и выглядит таким образом.)

Сначала найдите начальную вертикальную скорость (v0y) за счет импульса вдоль оси y:

v0y = Jy / m
    m is ball’s mass (in kilograms)
    Jy is impulse along the y  (forceApplied.y)
    (v0y will be negative if Jy is negative)

Затем найдите вертикальную составляющую скорости, когда мяч коснется земли (vy). Поскольку вы находите квадратный корень, вы получите ответы как +, так и –, используйте отрицательное значение.

vy ^2 = v0y ^2  +  2 * g * y
    g is your gravitational constant
    y is ball’s initial height 
    both g and y are negative in your case
    use the negative root, i.e.  vy should be negative

Найдите время (t), которое мяч находится в воздухе:

t = (vy – v0y) / g
    remember, vy and g are both negative

Теперь вам нужна скорость по оси x:

vx = Jx / m
    Jx is impulse along x  (forceApplied.x)
    m is the ball’s mass
    (the velocity along the x remains constant)

Наконец, найдите смещение (x) по оси x:

x = vx * t
    t is the value you got from the vertical motion equations
person bpedit    schedule 04.09.2016