SceneKit переместить камеру в направлении точки на полу - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь реализовать камеру, как в 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)
}

Это приводит к быстрому вращению камеры и в основном делать сумасшедшие вещи. Должен ли я придерживаться подхода преобразования для этой проблемы, есть ли другой способ добиться перемещения камеры к этой целевой точке?

Спасибо!

...