私はこれをどこでも探しましたが、私は何も考えていません。 Chris LattnerがWWDCのPlaygroundsとSceneKitでデモンストレーションしたことをどのように再現しますか?プレイグラウンドでSceneKitシーンをアニメーション化したいのですが。
私はSceneKitプロジェクトテンプレートからセットアップコードをカットアンドペーストしてみました。魔法のようにレンダリングが開始されると思いましたが、実際には開始されません。
私は基調講演を見て、ソースコードのヒントを探してラトナーの画面を一時停止および拡大してみましたが、彼はすべてのコードをプロジェクトの他の場所からインポートしているように見えたため、手がかりはありませんでした。ドキュメントに何もないようです、または私はそれを逃しています。
Swiftはバージョン間のソース互換性がないため、この回答のコードはSwiftの将来のバージョンでも以前のバージョンでも機能しない可能性があります。現在、Xcode 7.0 Playgroundsで機能するように更新されています= Swift 2.0。
XCPlayground
フレームワークはあなたが必要とするものであり、 それはここに文書化されています です。
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")
実行すると、次のようになります。
iOSプレイグラウンドでシーンキットを実行するには、[フルシミュレーターで実行]チェックボックスをオンにする必要があります。
プレイグラウンド設定は、ユーティリティペイン(⌥⌘ 非表示または表示)
IOSをターゲットとしてプレイグラウンドを実行し、最新のXcode 8.1を使用するために、DavidRö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 10.2にはPlaygroundSupport
フレームワークがあります。プレイグラウンドデータの共有、ライブビューの管理、プレイグラウンドの実行の制御を行います。
import PlaygroundSupport
プレイグラウンド内からプレイグラウンドサポートを使用して、次のことができます。
PlaygroundSupport
を使用して、コードをプレイグラウンドで実行した結果を示すライブビューを表示および非表示にすることもできます。多くの既存のタイプで利用可能な組み込みのライブビュー表現を活用することにより、独自のタイプのライブビューを作成できます。従来のライブビューは、XcodeのプレイグラウンドとSwift Playgroundsで利用できます。これらは、プレイグラウンドのコードと同じプロセスで実行されるため、通常どおりプロパティとメソッドにアクセスできますが、プレイグラウンドを実行するたびにリセットされます。Swift Playgroundsの常時オンのライブビューは、LiveView.Swiftをページに追加するとアクティブになり、独自のプロセスで実行されるため、情報を永続化できます。連続実行の間のビジュアル。常時オンのライブビューは、ページを離れるまでリセットされません。
私はコードを少し修正しました:
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")
遊び場が「intはCGFloatに変換できません」と文句を言う場合は、次のコード行を使用できます。
spin.toValue = NSValue(SCNVector4: SCNVector4(x: 1, y: 1, z: 0, w: CGFloat(2.0*M_PI)))
暗黙の型キャストはSwiftでは定義されていないようです。