SceneKit - позиционирование SCNCamera и разрешение вращения объекта - PullRequest
0 голосов
/ 04 апреля 2020

Я близок к завершению моего первого проекта в SceneKit, но я борюсь с последними несколькими шагами. Вероятно, проще всего объяснить мой прогресс, поделившись коротким снимком экрана Xcode Simulator, отображающим мою текущую сцену.

Как вы можете видеть на снимке экрана, мой проект состоит из трех элементы (все это делается в коде, я не импортирую никаких внешних активов):

  1. вне поля (определяется с помощью шести объектов SCNBox на угол)
  2. внутри солнца (определяется через Объект SCNTube для круга и объекты UIBezierPath на «луч»)
  3. положение камеры

На основе обратной связи я передал код в GitHub .

Прямо сейчас камера может вращаться, как видно на снимке экрана, но центр вращения камеры и объектов не выравнивается, поэтому кажется, что она вращается вне оси.

Вот где я хочу добраться:

  1. правильное положение камеры, чтобы совмещенная коробка и солнце располагались прямо перед камерой, заполняя экран
  2. . положение un как фиксированное (я полагаю, уже сделано)
  3. позволяет блоку свободно вращаться в направлении x, y & z вокруг солнца на основе сенсорного ввода - так что пользователь может «щелкнуть» блоком и наблюдать, как он переворачивается и вращаться вокруг солнца

Структура кода прямолинейна:

class GameViewController: UIViewController {

var gameView: SCNView!
var gameScene: SCNScene!
var cameraNode: SCNNode!
var targetCreationTime: TimeInterval = 0

override func viewDidLoad() {
    super.viewDidLoad()
    initView()
    initScene()   // createSun() and createCube() called here
    initCamera()
}

А по отношению к положению камеры:

   func initCamera() {
        let camera = SCNCamera()
        cameraNode = SCNNode()
        cameraNode.camera = camera
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 0)
        cameraNode.rotation = SCNVector4Make(1, 0, 0, .pi/2)
    }

Но что я Выяснилось, что, несмотря на то, что вы играете со случайными значениями cameraNode.position и cameraNode.rotation, вид камеры не меняется.

Мои вопросы - любая помощь будет принята с благодарностью :

  1. советы по изменению положения камеры (что я делаю не так ?!) - как только она окажется в нужном месте, я легко могу установить "gameView.allowsCameraControl = false"
  2. совет по как сделать так, чтобы коробка вращалась вокруг своей оси вокруг солнца (пока солнце остается неподвижным)
  3. растянуть цель! Любые общие сведения о материалах и освещении типа «ознакомьтесь с этим учебным пособием» и включение этого представления в представление SwiftUI

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Я решил прекратить борьбу с точкой вращения и вместо этого переместить элементы вокруг этого.

Одна интересная вещь, о которой я упоминал в начале создания createBox () fun c.

// originally debugCube & debugNode were used for debugging the pivot point of the box
// but I found have this large node helped to balance out the centre of mass
// set to fully transparent and added to boxNode as final step after all other transformations

Если вы закомментируете строки 19-26 плюс 117, вы получите полностью удалите debugNode. И как ни странно, когда вы делаете это, коробка перестает вращаться правильно. Но вы добавляете его обратно, и все исправлено. Я предполагаю, что это добавляет «массу» к общему узлу и помогает зафиксировать точку вращения в правильном положении. В итоге я просто сделал его прозрачным!

Окончательный код (версия 1.0) размещен на GitHub по адресу github.com / LedenMcLeden / lo go

0 голосов
/ 07 апреля 2020

Используйте этот ответ в сообщении для вашей камеры: 57586437, снимите поворот камеры и отключите управление камерой. Вращайте свой бокс с простым (я бы проверил независимое вращение x, y, z только для проверки), чтобы вы знали, правильна ли ваша точка вращения. По умолчанию все должно быть в порядке и вращаться прямо перед камерой, но зависит от того, как вы построили свой куб.

Если вы добавили солнце и прочее в качестве подузла вашего блока, то вы, вероятно, в приличной форме, и части будут вращаться вместе.

Если вы хотите сделать поворот камеры, аналогичный CameraControl, затем вам нужно будет добавить распознаватель жестов, а затем вы можете начать экспериментировать с ним.

Надеюсь, это поможет!

...