【问题标题】:Coordinate system doesn't seem to match between Playground and iOS Device/SimulatorPlayground 和 iOS 设备/模拟器之间的坐标系似乎不匹配
【发布时间】:2014-08-25 03:46:10
【问题描述】:

在过去的几天里,我一直在努力总结 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 中,第二行是 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 上都试过了 - 结果是一样的。

我在操场上看到的

我在 OSX 应用中看到的内容

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

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

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

更新 3

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

Playground project

OSX project

iOS project

如果您发现我做错了什么或者我可以如何做得更好,请告诉我!

感谢大家的帮助!

【问题讨论】:

  • 对场景的引用是如何在操场初始化的?您的 Playground 中场景的根节点可能与设备和模拟器上的坐标系不同..
  • 另外,请记住 Swift、Xcode 6、Playgrounds 等仍处于测试阶段,因此可能会发生变化或存在错误。如果文档说坐标系应该相同,那么您可以为其提交错误报告:)
  • 您的 Playground 代码是 OS X(我可以判断,因为 XCPShowView 在 iOS Playground 中尚不可用)。您是否在 OS X 项目中看到相同的结果?另外,我在您提供的代码中没有看到任何明确的相机设置。

标签: ios swift ios8 scenekit


【解决方案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

【讨论】:

    【解决方案2】:

    你没有在第一个场景中使用(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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多