Фон:
В настоящее время я работаю над проектом, в котором есть объект, и когда он движется, камера должна стремиться к нему, но в том направлении, в котором он движется, и быть немного позади него, так что объект находится в поле зрения (в основном объект всегда выглядит как идущий прямо вперед). У меня есть вся математика и код, чтобы сделать это, поэтому я не прошу помощи в выяснении этого.
Моя проблема:
Однако по какой-то причине, если я применю эти преобразования к узлу это обычный трехмерный объект, например, коробка, они работают отлично, но когда я делаю это на камере, меняется только угол, а не положение. затем, когда я закомментирую код, который преобразует угол, трансформации положения работают отлично.
На фотографии вы можете увидеть этот красный прямоугольник, к которому преобразования применяются правильно там, где он нацелен. направление движения зеленого шара. Его расстояние от мяча обозначается в коде переменной 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)