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)
}

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

Благодарность!

0 ответов

Другие вопросы по тегам