SceneKit перемещает камеру к точке на полу
Я пытаюсь реализовать подвешивание камеры аналогично тому, как это делает Cinema 4D. Если вы щелкнете по плоскости земли (то есть по моей геометрии пола), камера должна переместиться к точке, по которой вы щелкнули. Если вы щелкнете по воздуху (а не по полу), он должен двигаться в направлении камеры. Эту последнюю часть я выполнил с помощью следующего кода вmouseDragged
обработчик события:
let diffY = (startLoc.y - loc.y) * 0.08
let trans = SCNMatrix4MakeTranslation(0, 0, diffY)
let combined = SCNMatrix4Mult(trans, cameraNode.transform)
cameraNode.transform = combined
В diffY
Переменная - это просто количество перемещений мыши по оси Y с момента последнего обновления. Приведенный выше код отлично подходит для перемещения камеры в том направлении, в котором она смотрит.
Теперь о части, которую я не могу решить. Если вы щелкнете где-нибудь на плоскости земли, я попробую следующий код. Первый вmouseDown
Я записываю место, которое вы щелкнули:
let hits = sceneView.hitTest(loc, options: nil)
if let hit = hits.first, hit.node == floor {
targetHit = hit.worldCoordinates
}
Затем в mouseDragged
Я пробую следующее:
// The angle between the current camera position and the target
var angle: Float?
if let targetHit = targetHit {
// Calculate the angle
angle = SCNVector3.angle(a: cameraNode.position, b: targetHit)
// Create the translation transform
let trans = SCNMatrix4MakeTranslation(0, 0, diffY)
// Create the rotation transform
let rot = SCNMatrix4MakeRotation(CGFloat(angle!), 0, 1, 0)
// Combine them
let combined = SCNMatrix4Mult(trans, rot)
cameraNode.transform = SCNMatrix4Mult(cameraNode.transform, combined)
}
Это приводит к тому, что камера быстро вращается и делает сумасшедшие вещи. Должен ли я придерживаться подхода преобразования для этой проблемы, есть ли другой способ добиться перемещения камеры к этой целевой точке?
Благодарность!