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

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

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

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

4 ответов


поскольку Swift не имеет исходной совместимости между версиями, код в этом ответе может не работать ни в будущих, ни в предыдущих версиях Swift. В настоящее время он обновлен для работы в Xcode 7.0 Playgrounds с 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


обратите внимание, что для запуска Scene Kit в iOS playground, вам нужно проверить флажок" запустить в полном симуляторе".

enter image description here

вы найдете настройки игровой площадки в панели утилиты (0 скрыть или показать)


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

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


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

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 (значок двух пересекающихся кругов на панели инструментов)

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

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

неявные типы, похоже, не определены в swift.