SCNNode Посмотрите на текущую позицию и всегда ориентируйте относительно - PullRequest
0 голосов
/ 06 февраля 2019

Проблема:

Я пытаюсь заставить узел смотреть на телефон так, чтобы верхняя часть узла ВСЕГДА указывала на северный полюс телефона, независимо от того, как телефонориентированный.Давайте предположим, что узел находится в центре, а телефон начинается с (0, 0, 10), и предположим, что узел имеет геометрию прямоугольника, которая аналогична геометрии телефона.Я хочу, чтобы вершина этого прямоугольника всегда указывала вверх относительно того места, где я нахожусь.

Итак, у нас есть

let node = SCNNode()
node.position = SCNVector3(0, 0, 0)

self.sceneView.pointOfView.position = (0, 0, 10)

//The top of the node should be pointing towards (0, 100, 0) and 
//should be facing the phone.

Initial Position

Теперь давайте перейдем к self.sceneView.pointOfView.position = (10, 0, 0), поэтому мы хотим, чтобы узелследуйте и поворачивайте вокруг оси Y на 90 градусов.

node.eulerAngles.y = Float(90*Double.pi/180)

change to X axis

Теперь давайте переместимся по телефону в положение self.sceneView.pointOfView.position = (0, 10, 0)

У нас есть начальное вращение на 90 градусов вокруг оси Y, и теперь мы добавляем вращение вокруг ОРИГИНАЛЬНОЙ оси X или ТЕКУЩЕЙ оси Z от нашей текущей позиции.(Я говорю это, потому что я открыт для предложений о том, как решить эту проблему, и я хочу, чтобы это было как можно более понятным).

Итак, теперь у нас есть

node.eulerAngles.x = Float(90*Double.pi/180)

, и наш узел указывает«ВВЕРХ» относительно нашей позиции;то есть, мы находимся перед узлом, и узел указывает «ВВЕРХ», основываясь на наших прошлых преобразованиях.

enter image description here

Мои усилия:

Я пытался использовать node.look(at:, up:, localFront:) безрезультатно.Я попытался

node.look(at: self.sceneView.pointOfView!.position, up: self.sceneView.pointOfView.worldUp, localFront: SCNNode.localFront)

, но это заставляет node двигаться, когда я поворачиваю телефон, и я не хочу, чтобы это произошло.Я не хочу, чтобы node двигался, когда я поворачиваюсь от пейзажа к портрету, а также я не хочу, чтобы node вращался.

Вопрос:

Как мне сделать так, чтобы узел всегда был направлен вверх от моей позиции и всегда смотрел на меня, не двигаясь, не поворачиваясь и не поворачиваясь, когда яповернуть телефон?Я хочу только движения X и Y.Я открыт для любых предложений.

1 Ответ

0 голосов
/ 08 июля 2019
func carouselLookAtMe() {
    //Here we use tangent lines on a sphere, relating to the POSITIVE Y Axis, to find the point at which the up direction is.
    let currentPos = self.sceneView.pointOfView!.position
    let D:Float = pow(currentPos.x, 2) + pow(currentPos.y, 2) + pow(currentPos.z, 2)

    let newPos = SCNVector3(0, abs(Float(D/Float(currentPos.y))), 0)
    let xDiff = currentPos.x-self.carousel.position.x
    let yDiff = currentPos.y-self.carousel.position.y
    let zDiff = currentPos.z-self.carousel.position.z

    let upVectorPos = SCNVector3(newPos.x-xDiff, newPos.y-yDiff, newPos.z-zDiff)
    self.carousel.look(at: self.sceneView.pointOfView!.position, up: upVectorPos, localFront: SCNVector3(0, 0, 1))
}

Примечания: self.carousel - это узел, на который я хочу посмотреть.Он продолжает смотреть на меня, ориентируясь вверх, условно говоря.

Я называю это внутри func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)

...