2016-12-06 2 views
1

В SceneKit вы можете добавить ограничение LookAtConstraint к точке зрения SceneView, чтобы заставить камеру смотреть на определенный узел.В SceneKit, как вы делаете камеру, глядя на определенную грань геометрии узла?

Есть ли стандартный способ сделать то же самое, но для определенной грани геометрии?

Так что, если я коснусь определенной поверхности куба, камера будет двигаться так, чтобы ось Z узла камеры соответствовала нормали касания лица? Чтобы куб выглядел бы как плоскость, формируя новую перспективу.

ответ

2

No.

Это потребует движения камеры, в дополнение к повторно с целью его.

Представьте, что я перед домом. У меня прекрасный вид спереди и я едва вижу сторону слева от меня. В моей Сцене я коснулся стороны дома. Ограничение LookAt просто изменило бы угол обзора камеры. Это не будет соответствовать нормам этой едва заметной стороны.

Чтобы соответствовать нормальному, мне придется ходить по дому, пока я не буду смотреть на дом и быть перпендикулярным той стороне, которую я постучал. В каком радиусе? Какой путь? Вы должны это понять сами.

В зависимости от того, какой эффект вы пытаетесь использовать, вы можете повернуть модель вместо перемещения камеры. Поверните перехваченный узел локально (или как дочерний элемент невидимого родителя), чтобы его ось минус-Z указывала обращенную грань и сохраняла объект LookAtContraint на узле , а не на камере. Однако этот подход изменит внешний вид объекта: вы увидите, что он вращается, а затемнение меняется соответствующим образом.

+0

Спасибо Хэл, имеет смысл. –

1

Так что, если я коснусь определенного лица куба, камера будет двигаться так, чтобы ось Z узла камеры попала в линию с нормальным касанием лица?

Предположив вы используете хит-тестирование, чтобы определить, какой объект были касание SCNHitTestResult даст вам обоим localCoordinates и localNormal, из которого она должна быть достаточно легко вывести камеру преобразования.

Одним из простых способов было бы иметь камеру как дочерний узел коробки, вычислить позицию, которая будет выглядеть как localCoordinates + distance * localNormal и, наконец, преобразование с использованием GLKMatrix4MakeLookAt и SCNMatrix4FromGLKMatrix4.

Обратите внимание, что вы также можете использовать worldCoordinates, worldNormal, а также утилиты преобразования, такие как SCNNode.convertTransform(_:from:).

+0

благодарит много @mnuages, заглянет в это. –

Смежные вопросы