3

ここ数日、Xcode 6 と iOS 8 のすべての利点について頭を悩ませてきました。私は現在、SceneKit を使用して、何ができるかを感じています。

シーンにオブジェクトを配置しやすくするために、視覚的なグリッドを構築しようとしています。

Playground は期待どおりに表示されますが、Simulator/Device はそうではありません。それがバグなのか、何か間違ったことをしているのかはわかりません。

次のコードがあります。

for index in -20..20 {
  let i   = CFloat(index)
  let neg = i - 20
  let pos = i + 20

  var lat = [
    SCNVector3Make(neg, 0, i),
    SCNVector3Make(pos, 0, i)
  ]
  var lng = [
    SCNVector3Make(i, 0, neg),
    SCNVector3Make(i, 0, pos)
  ]

  var indices: CInt[] = [0, 1]

  let latSource = SCNGeometrySource(vertices:&lat, count:2)
  let lngSource = SCNGeometrySource(vertices:&lng, count:2)
  let indexData = NSData(bytes:indices, length:sizeof(CInt) * countElements(indices))
  let element = SCNGeometryElement(data:indexData, primitiveType:SCNGeometryPrimitiveType.Line, primitiveCount:2, bytesPerIndex:sizeof(CInt))
  let latLine = SCNGeometry(sources:[latSource], elements:[element])
  let lngLine = SCNGeometry(sources:[lngSource], elements:[element])

  let latLineNode = SCNNode(geometry:latLine)
  let lngLineNode = SCNNode(geometry:lngLine)

  scene.rootNode.addChildNode(latLineNode)
  scene.rootNode.addChildNode(lngLineNode)
}

Playground の 2 行目はlet i = CGFloat(index)ですが、コードは Playground と私が持っている iOS Xcode 6 プロジェクトの間で同じです。

Playground では、目的のグリッドを取得します。ただし、シミュレーターとデバイスでは、ガベージが発生します。呼び出しをどのように変更してもSCNVector3Make、iOS またはシミュレーターでグリッドを適切に表示できません。

また、シミュレータとデバイスに表示される内容は同じであることに注意してください。

シーンにもボックスを追加してみました。を使用するSCNBoxと、正しく表示されますが、必要以上に大きくなります。ただし、(Playground で正しく動作する) カスタム ジオメトリを使用すると、ボックスの寸法が大きくずれます。立方体というより壁のように見えます。

私が見ているものを示すためにスクリーンショットを含めようとしましたが、画像を投稿するには少なくとも10の評判ポイントが必要なようです.

前もって感謝します!

アップデート

以下のコメンターの質問に答えるには(シーンの初期化方法に関して):

プロジェクト(Simulator/Device で実行される)では、次のように取得します。

let scene = SCNScene()
let sceneView = SCNView(frame:UIScreen.mainScreen().bounds)
// Build up grid
sceneView.scene = scene
self.view = sceneView

Playground では、次のようにします。

let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 500, height: 300))
let scene = SCNScene()
sceneView.scene = scene
XCPShowView("The Scene View", sceneView)
// Build up grid

更新 2

OSX アプリを作成し、生成された GameViewController コードを変更して同じ構造を生成すると、すべてが期待どおりに機能しました。ボックスの色を赤に更新しませんでした。OSX アプリではキューブとカメラの位置が少し異なります。

十分なポイントが得られたので、私が見ているものを示す画像を追加します。

また、 Xcode Beta 2 と 3 の両方でこれを試したことに注意してください。結果は同じでした。

プレイグラウンドで見たもの

ここに画像の説明を入力

OSX アプリに表示される内容

ここに画像の説明を入力

iOS シミュレータで見たもの

ここに画像の説明を入力

iOS 8 を電話と iPad で削除したので、それらのスクリーン ショットはありませんが、シミュレータと同じように見えます。

これについては、Apple を通じてバグ レポートを提出します。

更新 3

これらのプロジェクトのリポジトリを作成したので、興味のある人は誰でも見ることができます (おそらく、私が間違っていることに気付いていないことがあります)。

遊び場プロジェクト

OSX プロジェクト

iOS プロジェクト

私が間違っていることや、どうすればもっとうまくやれるか教えてください。

助けてくれてありがとう!

4

2 に答える 2

1

最近、Playground で UIBezierPath を使用して同様の問題が発生しました。Apple 開発者フォームに質問を投稿すると、Playground はデバイス (ULO) とは異なる座標系 (LLO) を使用していると思います。

https://forums.developer.apple.com/message/39277#39277

2つの座標系に関するAppleのドキュメントは次のとおりです。

https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html#//apple_ref/doc/uid/TP40010156-CH14-SW10

于 2015-08-11T00:27:40.723 に答える
-1

最初のシーン (frame:UIScreen.mainScreen().bounds) で使用していません。

プロジェクト(シミュレーター/デバイスで実行される)では、これを取得する方法は次のとおりです。

let scene = SCNScene()
let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 500, height: 300))
// Build up grid
sceneView.scene = scene
self.view = sceneView

Playground では、次のようにします。

let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 500, height: 300))
let scene = SCNScene()
sceneView.scene = scene
XCPShowView("The Scene View", sceneView)
于 2014-09-05T07:06:58.213 に答える