Как повернуть SCNNode, чтобы следовать за линией

У меня есть SCNNode, по которому я хотел бы пройти по пути, состоящему из точек, представленных SCNVector3s. Однако вместо того, чтобы просто перемещаться от точки к точке, я хотел бы, чтобы она поворачивалась лицом в направлении каждой точки, к которой он движется. Я знаю, что установка SCNLookAtConstraint может помочь в этом, но я считаю, что это будет управлять только направлением, в котором обращена отрицательная ось z, но я хотел бы также иметь возможность управлять осью y, чтобы ее отрицательная ось y всегда обращалась к трассе. Надеюсь, я был достаточно ясен, но не стесняйтесь просить разъяснений. Спасибо!


person Ben Proothi    schedule 14.04.2021    source источник
comment
Возможно, вас заинтересует функция updatePositionAndOrientationOf из этого ответа   -  person aheze    schedule 14.04.2021
comment
Пожалуйста, поправьте меня, если я ошибаюсь, но я понимаю, что эта функция будет использоваться для перемещения объекта в положение перед моим движущимся узлом, но мне нужно, чтобы мой движущийся узел изменил его ориентацию, когда он движется к определенной точке.   -  person Ben Proothi    schedule 14.04.2021
comment
О да. Nvm, на самом деле это не очень актуально   -  person aheze    schedule 14.04.2021
comment
вы можете использовать некоторые SCNConstraints   -  person ZAY    schedule 14.04.2021


Ответы (1)


Сначала moveTo () - похоже, у вас есть правильная идея, просто сбросьте свой следующий ход в обработчике завершения. Я предполагаю, что вы делаете это вручную, поэтому установите ограничение lookAt, когда начнется следующий ход, и наведите его на цель. Я думаю, что это будет делать то, что вы хотите, но в зависимости от нескольких вещей, например, как быстро он движется, пролетаете ли вы через targetNode или над ним, определенные ситуации могут вызвать его «подпрыгивание». Если я правильно понимаю ваш вопрос по оси Y - lookAt столкнется с узлом и будет привязан к нему. Если вы находитесь на ровной поверхности, не думаю, что это будет проблемой.

func moveTo()
    {
        let vPanelName = moves[moveCount]
        let vLaneNode = grid.gridPanels[vPanelName]!.laneNodes[lane]
        let vAction = SCNAction.move(to: vLaneNode.presentation.position, duration: TimeInterval(data.getAttackSpeed(vGameType: gameType)))
        
        node.runAction(vAction, completionHandler:
            {
                self.moveCount += 1
                if(self.moveCount >= self.moves.count - 1)
                {
                    self.killMe(vRealKill: false)
                    return
                }
                else
                {
                    self.moveTo()
                }
        })
    }
person Voltan    schedule 18.04.2021