游乐场和iOS设备/模拟器之间的坐标系似乎不匹配

3
我最近几天一直在努力理解Xcode 6和iOS 8的所有好处。我目前正在使用SceneKit来感受它能做什么。
我试图构建一个可视化网格,以使场景中物体的放置更加容易。
Playground显示了我期望的效果,但模拟器/设备没有。我不确定这是一个错误还是我做错了什么。
我有以下代码:
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 中,第二行是 let i = CGFloat(index),但除此之外,我的 Playground 和 iOS Xcode 6 项目中的代码完全相同。
在 Playground 中,我得到了想要的网格。然而,在模拟器和设备上,我得到了垃圾。无论如何改变SCNVector3Make的调用,我都无法在iOS或模拟器中正确显示网格。
还应该注意的是,模拟器和设备上显示的内容是相同的。
我也尝试添加一个盒子到场景中。当我使用SCNBox时,它会正确显示-虽然比它应该的大得多。然而,当我使用自定义几何体(在Playground中有效)时,盒子的尺寸就偏差很大。它看起来更像一堵墙而不是一个立方体。
我试图包含截图以展示我所看到的内容,但显然我需要至少10个声望点才能发布图片,抱歉。
提前感谢!
更新
回答下面评论者的问题(关于我如何初始化场景):
在项目中(在模拟器/设备上运行),我是这样做的:
let scene = SCNScene()
let sceneView = SCNView(frame:UIScreen.mainScreen().bounds)
// Build up grid
sceneView.scene = scene
self.view = sceneView

在游乐场,我这样做:
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上都尝试过这个方法-结果完全相同。

我在Playground中看到的内容

enter image description here

我在OSX应用程序中看到的内容

enter image description here

我在iOS模拟器中看到的

enter image description here

我从我的手机和iPad上删除了iOS 8,所以我没有任何来自那些设备的截屏 - 但它们看起来与模拟器完全相同。我将通过苹果提交一个错误报告。
更新3:我已经为这些项目创建了存储库,因此任何感兴趣的人都可以查看(也许有些我不知道的做错了什么): Playground project OSX project iOS project 如果您发现我做错了什么或者有更好的方法,请告诉我!
谢谢大家的帮助!

在游乐场中,场景的引用是如何初始化的?您游乐场中场景的根节点可能具有与设备和模拟器上不同的坐标系。 - JuJoDi
另外,请记住,Swift、Xcode 6、Playgrounds等仍处于测试版阶段,因此可能会发生变化或存在错误。如果文档中说坐标系统应该相同,则可以为此提交错误报告 :) - iFeli
你的 playground 代碼是 OS X(我可以看出來,因為 XCPShowView 在 iOS playground 中還不可用)。在 OS X 項目中是否看到相同的結果?此外,在您提供的代碼中,我沒有看到任何明確的相機設置。 - David Rönnqvist
2个回答

1

-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

在游乐场,我这样做:
let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 500, height: 300))
let scene = SCNScene()
sceneView.scene = scene
XCPShowView("The Scene View", sceneView)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接