(Swift Scene Kit) Камера вращается, только когда применяются как вращение, так и преобразование положения - PullRequest
0 голосов
/ 13 марта 2020

Фон:

В настоящее время я работаю над проектом, в котором есть объект, и когда он движется, камера должна стремиться к нему, но в том направлении, в котором он движется, и быть немного позади него, так что объект находится в поле зрения (в основном объект всегда выглядит как идущий прямо вперед). У меня есть вся математика и код, чтобы сделать это, поэтому я не прошу помощи в выяснении этого.

Моя проблема:

Однако по какой-то причине, если я применю эти преобразования к узлу это обычный трехмерный объект, например, коробка, они работают отлично, но когда я делаю это на камере, меняется только угол, а не положение. затем, когда я закомментирую код, который преобразует угол, трансформации положения работают отлично.

На фотографии вы можете увидеть этот красный прямоугольник, к которому преобразования применяются правильно там, где он нацелен. направление движения зеленого шара. Его расстояние от мяча обозначается в коде переменной rad и составляет 10 единиц. Когда такое же преобразование применяется к камере, оно находится на расстоянии всего +10 единиц по оси z, а не от смеси между Z и X, а затем свободно вращается в этом положении.

В коде я в настоящее время просто редактирую положение узла и затем применяю функцию вращения, но тот же самый точный результат происходит независимо от того, какой метод я использую (изменение угла Эйлера, преобразование положения и т. Д. c .) вот код:

(deathNode имеет положение объекта, на который нацелен, phi - угол поворота, и рассматриваемые строки кода находятся в самом низу, но я включил все, что может оказаться уместным)

    let rad = Float(10)
    if x1 == 0 && x == 0 {
        cpx = cameraNode.position.x
        cpy = cameraNode.position.z
        camY = cameraNode.position.y
    }else if x1 <= 0 && x <= 0 {
        cpx = deathNode.worldPosition.x - rad*cos(phi + (pi)/2)
        cpy = deathNode.worldPosition.z + rad*sin(phi + (pi)/2)
    }else if x1 <= 0 && x >= 0{
        cpx = deathNode.worldPosition.x - rad*cos(phi + (pi)/2)
        cpy = deathNode.worldPosition.z + rad*sin(phi + (pi)/2)
    }else if x1 >= 0 && x <= 0 {
        cpx = deathNode.worldPosition.x - rad*cos(phi + (pi)/2)
        cpy = deathNode.worldPosition.z + rad*sin(phi + (pi)/2)
    }else if x1 >= 0 && x >= 0 {
        cpx = deathNode.worldPosition.x - rad*cos(phi + (pi)/2)
        cpy = deathNode.worldPosition.z + rad*sin(phi + (pi)/2)
    }
}
cameraNode.worldPosition = SCNVector3(x: cpx, y: SCNFloat(camY), z: cpy)
cameraNode.rotation = SCNVector4(x: 0, y: 1, z: 0, w: phi) 
...