29

私はこれをどこでも探しましたが、空白になります。Chris Lattner が WWDC で Playgrounds と SceneKit を使ってデモを行っていたことをどのように再現しますか? Playgrounds で SceneKit シーンをアニメーション化する必要があります。

魔法のようにレンダリングが開始されるのではないかと思い、SceneKit プロジェクト テンプレートからセットアップ コードをカット アンド ペーストしてみましたが、そうではありません。

基調講演を見て、ソース コードのヒントを探して Lattner の画面を一時停止して拡大しようとしましたが、彼は自分のプロジェクトの他の場所からすべてのコードをインポートしているように見えたので、何の手がかりも得られませんでした。ドキュメントには何もないように見えます。または、それがありません。

4

5 に答える 5

53

Swift にはバージョン間のソース互換性がないため、この回答のコードは Swift の将来または以前のバージョンでは機能しない可能性があります。現在、Swift 2.0 の Xcode 7.0 Playgrounds で動作するように更新されています。


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")

実行すると、次のようになります。

ここに画像の説明を入力


Scene Kit をiOSプレイグラウンドで実行するには、[Run in Full Simulator] チェックボックスをオンにする必要があることに注意してください。

ここに画像の説明を入力

[ユーティリティ] ペイン (⌥</kbd>⌘</kbd>0 to hide or show)

于 2014-06-09T19:13:24.510 に答える
5

Moshe の応答を拡張します。

そのキーボードの組み合わせがうまくいかない場合は、メニュー バーに移動して、[表示] > [アシスタント エディター] > [アシスタントを表示] を選択してみてください。

于 2014-06-09T19:09:42.600 に答える
3

Xcode 10.2 にはPlaygroundSupportフレームワークがあります。プレイグラウンド データを共有し、ライブ ビューを管理し、プレイグラウンドの実行を制御します。

import PlaygroundSupport

プレイグラウンド内からプレイグラウンド サポートを使用して、次のことを行うことができます。

  • Playground ページにアクセスしてその実行を管理する
  • 永続データへのアクセスと共有
  • 学習者の進捗状況を評価し、ヒントを更新し、成功テキストを表示します

PlaygroundSupportを使用して、プレイグラウンドでコードを実行した結果を示すライブ ビューを表示および非表示にすることもできます。多くの既存のタイプで使用できる組み込みのライブ ビュー表現を利用して、独自のタイプのライブ ビューを作成できます。従来のライブ ビューは、Xcode の Playground と Swift Playgrounds で利用できます。それらはプレイグラウンドのコードと同じプロセスで実行されるため、通常どおりプロパティとメソッドにアクセスできます。ただし、プレイグラウンドを実行するたびにリセットされます。ページに LiveView.swift を追加するとアクティブ化される Swift Playgrounds の常時ライブ ビューは、独自のプロセスで実行されるため、連続する実行間で情報とビジュアルを保持できます。常時表示のライブ ビューは、ページを離れるまでリセットされません。


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 に答える