Использование SceneKit в Swift Playground

Я везде искал это, но я подхожу. Как вы копируете то, что демонстрирует Крис Лэттнер с игровыми площадками и SceneKit на WWDC? Я хочу иметь сцену SceneKit, анимацию, в Playgrounds.

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

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

Ответы

Ответ 1

Так как Swift не имеет совместимости версий между версиями, код в этом ответе может не работать ни в будущих, ни в предыдущих версиях Swift. В настоящее время обновлено для работы на игровых площадках Xcode 7.0 с Swift 2.0.


Структура XCPlayground - это то, что вам нужно, и здесь описано здесь.

Вот очень простая сцена, чтобы вы начали с Scene Kit в Swift:

import Cocoa        // (or UIKit for iOS)
import SceneKit
import QuartzCore   // for the basic animation
import XCPlayground // for the live preview

// create a scene view with an empty scene
var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
var scene = SCNScene()
sceneView.scene = scene

// start a live preview of that view
XCPShowView("The Scene View", view: sceneView)

// default lighting
sceneView.autoenablesDefaultLighting = true

// a camera
var cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0, y: 0, z: 3)
scene.rootNode.addChildNode(cameraNode)

// a geometry object
var torus = SCNTorus(ringRadius: 1, pipeRadius: 0.35)
var torusNode = SCNNode(geometry: torus)
scene.rootNode.addChildNode(torusNode)

// configure the geometry object
torus.firstMaterial?.diffuse.contents  = NSColor.redColor()   // (or UIColor on iOS)
torus.firstMaterial?.specular.contents = NSColor.whiteColor() // (or UIColor on iOS)

// set a rotation axis (no angle) to be able to
// use a nicer keypath below and avoid needing
// to wrap it in an NSValue
torusNode.rotation = SCNVector4(x: 1.0, y: 1.0, z: 0.0, w: 0.0)

// animate the rotation of the torus
var spin = CABasicAnimation(keyPath: "rotation.w") // only animate the angle
spin.toValue = 2.0*M_PI
spin.duration = 3
spin.repeatCount = HUGE // for infinity
torusNode.addAnimation(spin, forKey: "spin around")

Когда я запустил его, он выглядит так:

enter image description here


Обратите внимание, что для запуска набора сценариев на игровой площадке iOS вам необходимо установить флажок "Запустить в полном симуляторе".

enter image description here

Вы найдете настройку игровой площадки в панели "Утилиты" ( 0, чтобы скрыть или показать)

Ответ 2

Расширение ответа Моше.

Если эта комбинация клавиш не работает для вас, попробуйте перейти к строке меню и выберите "Просмотр" > "Редактор помощников" > "Показать помощник".

Ответ 3

Чтобы игровая площадка работала с iOS в качестве цели, и используя последний Xcode 8.1, я получил ее работу со следующими изменениями в исходном коде David Rönnqvist.

import UIKit
import SceneKit
import QuartzCore   // for the basic animation
import PlaygroundSupport


// create a scene view with an empty scene
var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
var scene = SCNScene()
sceneView.scene = scene
PlaygroundPage.current.liveView = sceneView

// default lighting
sceneView.autoenablesDefaultLighting = true

// a camera
var cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0, y: 0, z: 3)
scene.rootNode.addChildNode(cameraNode)

// a geometry object
var torus = SCNTorus(ringRadius: 1, pipeRadius: 0.35)
var torusNode = SCNNode(geometry: torus)
scene.rootNode.addChildNode(torusNode)

// configure the geometry object
torus.firstMaterial?.diffuse.contents  = UIColor.red
torus.firstMaterial?.specular.contents = UIColor.white

// set a rotation axis (no angle) to be able to
// use a nicer keypath below and avoid needing
// to wrap it in an NSValue
torusNode.rotation = SCNVector4(x: 1.0, y: 1.0, z: 0.0, w: 0.0)

// animate the rotation of the torus
var spin = CABasicAnimation(keyPath: "rotation.w") // only animate the angle
spin.toValue = 2.0*M_PI
spin.duration = 3
spin.repeatCount = HUGE // for infinity
torusNode.addAnimation(spin, forKey: "spin around")

Главное, что вам нужно сделать, это:

  • для назначения игровой площадке liveView и
  • также откройте редактор Xcode Assistant (значок двух пересекающихся кругов на панели инструментов)

Ответ 4

Если игровая площадка жалуется на "int не конвертируется в CGFloat", вы можете использовать эту строку кода:

spin.toValue = NSValue(SCNVector4: SCNVector4(x: 1, y: 1, z: 0, w: CGFloat(2.0*M_PI)))

Неявные приведения типов, по-видимому, не определены в скором времени.