坐标系似乎在Playground和iOS设备/模拟器之间不匹配

时间:2014-07-03 21:25:21

标签: ios swift ios8 scenekit

在过去的几天里,我一直试图围绕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项目中的代码相同。

在游乐场,我得到了我追求的网格。然而,在模拟器和设备上,我得到了垃圾。无论我如何更改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 - 结果完全相同。

我在游乐场看到的内容

enter image description here

我在OSX应用中看到的内容

enter image description here

我在iOS模拟器中看到的内容

enter image description here

我通过手机和iPad删除了iOS 8,因此我没有任何屏幕截图 - 但它们看起来与模拟器相同。

我将通过Apple提交错误报告。

更新3

我已经为这些项目创建了回购,所以任何有兴趣的人都可以看看(也许有些东西我不知道我做错了):

Playground project

OSX project

iOS project

如果你看到我做错了什么或者我怎么做得更好,请告诉我。

感谢大家的帮助!

2 个答案:

答案 0 :(得分:1)

我最近在Playground中使用UIBezierPath进行了类似的问题。在Apple开发者表单中发布问题后,我认为Playground确实使用了与设备(ULO)不同的坐标系(LLO):

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

这是关于两个坐标系的苹果文档:

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

答案 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)