Использование 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)))
Неявные приведения типов, по-видимому, не определены в скором времени.