29

我到处找这个,但我是空白的。您如何复制 Chris Lattner 在 WWDC 上使用 Playgrounds 和 SceneKit 演示的内容?我想在 Playgrounds 中有一个 SceneKit 场景,动画。

我尝试从 SceneKit 项目模板中剪切和粘贴设置代码,以为它会神奇地开始渲染,但事实并非如此。

我尝试观看主题演讲并在 Lattner 的屏幕上暂停并放大以寻找源代码的提示,但他似乎正在从他项目的其他地方导入他的所有代码,所以它没有给我任何线索。文档中似乎没有任何内容,或者我错过了它。

4

5 回答 5

53

由于 Swift 在版本之间没有源代码兼容性,因此此答案中的代码可能在未来或以前版本的 Swift 中都不起作用。目前已更新为在 Xcode 7.0 Playgrounds 和 Swift 2.0 中工作。


XCPlayground框架是您所需要的,并在此处记录

这是一个非常简单的场景,可帮助您开始使用 Swift 中的 Scene Kit:

import SceneKit
import QuartzCore   // for the basic animation
import XCPlayground // for the live preview
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

// start a live preview of that view
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  = NSColor.red   // (or UIColor on iOS)
torus.firstMaterial?.specular.contents = NSColor.white // (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*Double.pi
spin.duration = 3
spin.repeatCount = HUGE // for infinity
torusNode.addAnimation(spin, forKey: "spin around")

当我运行它时,它看起来像这样:

在此处输入图像描述


请注意,要在iOS操场上运行 Scene Kit,您需要选中“在完整模拟器中运行”复选框。

在此处输入图像描述

您可以在实用程序窗格中找到 Playground 设置(⌥</kbd>⌘</kbd>0 to hide or show)

于 2014-06-09T19:13:24.510 回答
9

为了让 Playground 以 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 Editor(工具栏上的两个相交的圆圈图标)
于 2016-11-18T13:10:01.810 回答
5

扩展 Moshe 的回应。

如果该键盘组合对您不起作用,请尝试转到菜单栏并选择查看 > 助手编辑器 > 显示助手。

于 2014-06-09T19:09:42.600 回答
3

在 Xcode 10.2 中有一个PlaygroundSupport框架。它共享 Playground 数据、管理实时视图并控制 Playground 的执行。

import PlaygroundSupport

您可以在 Playground 内使用 Playground Support 来:

  • 访问游乐场页面并管理其执行
  • 访问和共享持久数据
  • 评估学习者的进度、更新提示并显示成功文本

您还可以使用PlaygroundSupport来显示和关闭实时视图,这些视图显示了在 Playground 中运行代码的结果。您可以利用许多现有类型上可用的内置实时视图表示来为您自己的类型创建实时视图。Xcode 和 Swift Playgrounds 的 Playground 中提供了传统的实时视图。它们与 Playground 中的代码在同一进程中运行,因此您可以像往常一样访问它们的属性和方法;但是,每次运行 Playground 时它们都会重置。Swift Playgrounds 中始终在线的实时视图在您将 LiveView.swift 添加到页面时激活,它在自己的进程中执行,因此您可以在连续运行之间保留信息和视觉效果。在您离开页面之前,永远在线的实时视图不会重置。


关于适用于 iPad 的Swift Playgrounds阅读此处


编码:

import PlaygroundSupport
import UIKit
import SceneKit
import QuartzCore

var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 1000, height: 200))
var scene = SCNScene()
sceneView.scene = scene
sceneView.backgroundColor = .black
PlaygroundPage.current.liveView = sceneView

var lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light?.type = .directional
lightNode.light?.intensity = 3000
lightNode.light?.shadowMode = .deferred
lightNode.rotation = SCNVector4(x: 0, y: 0, z: 0.5, w: 1.5 * Float.pi)
scene.rootNode.addChildNode(lightNode)

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

var box = SCNBox(width: 3, height: 3, length: 3, chamferRadius: 0.4)
var boxNode = SCNNode(geometry: box)
scene.rootNode.addChildNode(boxNode)

box.firstMaterial?.diffuse.contents  = UIColor.blue
box.firstMaterial?.specular.contents = UIColor.purple
boxNode.rotation = SCNVector4(x: 1.0, y: 1.0, z: 0.0, w: 0.0)
boxNode.scale = SCNVector3(x: 1.0, y: 1.0, z: 1.0)

var spin = CABasicAnimation(keyPath: "rotation.w")
var scale = CABasicAnimation(keyPath: "scale.x")
spin.toValue = 3 * -CGFloat.pi
spin.duration = 2
spin.repeatCount = .greatestFiniteMagnitude
scale.toValue = 1.5
scale.duration = 2
scale.repeatCount = .infinity
boxNode.addAnimation(spin, forKey: "spin around")
boxNode.addAnimation(scale, forKey: "scale x")

在此处输入图像描述

于 2019-04-22T02:00:24.017 回答
1

如果操场抱怨“int is not convertible to CGFloat”,那么你可以使用这行代码:

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

隐式类型转换似乎没有在 swift 中定义。

于 2014-08-08T16:56:30.433 回答