Использование 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")
когда я запускаю его, похоже, это:
обратите внимание, что для запуска Scene Kit в iOS playground, вам нужно проверить флажок" запустить в полном симуляторе".
вы найдете настройки игровой площадки в панели утилиты (⌥⌘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.