Я пытаюсь реализовать камеру, как в 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)
}
Это приводит к быстрому вращению камеры и в основном делать сумасшедшие вещи. Должен ли я придерживаться подхода преобразования для этой проблемы, есть ли другой способ добиться перемещения камеры к этой целевой точке?
Спасибо!