【问题标题】:Using SCNFloor in ARKIt在 ARKIt 中使用 SCNFloor
【发布时间】:2017-08-29 02:53:44
【问题描述】:

在几乎所有ARKit的教程中,似乎我们总是使用ARPlane作为地板。

let planeGeometry = SCNPlane(width:CGFloat(planeAnchor.extent.x), height:CGFloat(planeAnchor.extent.z))
let planeNode = SCNNode(geometry:planeGeometry)
planeNode.position = SCNVector3(x:planeAnchor.center.x, y:0, z:planeAnchor.center.y)
planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1.0, 0, 0)

如果您想要一个无限平面(用于投射阴影)怎么办?我尝试了 SCNFloor,结果很奇怪——地板悬在半空:

let planeGeometry = SCNFloor()
let planeNode = SCNNode(geometry:planeGeometry)
planeNode.position = SCNVector3(planeAnchor.center.x, 0, planeAnchor.center.z)

我进行了谷歌搜索,我得到的唯一结果是这个(这也不起作用):https://github.com/arirawr/ARKit-FloorIsLava/blob/master/FloorIsLava/ViewController.swift

SCNFloor() 可以在 ARKit 中使用吗?如果没有,我该怎么做才能造出一个大飞机?

【问题讨论】:

  • 使用 SCNPlane。 SCNFloor 似乎以各种方式损坏/奇怪。

标签: swift scenekit arkit


【解决方案1】:

你可以改变这条线,让你的飞机随心所欲:

let planeGeometry = SCNPlane(width:CGFloat(planeAnchor.extent.x),height:CGFloat(planeAnchor.extent.z)

上面的方式,它与检测到的平面的大小相匹配,ARKit 在此过程中会更新。

你可以像这样把它变大一点:

let overHang:CGFloat = 0.2
...
let planeGeometry = SCNNode(geometry: SCNPlane(width: CGFloat(planeAnchor.extent.x)+overHang, height: CGFloat(planeAnchor.extent.z)+overHang))

或者,只需使用 CGFloat 以米为单位指定大小:

let theSize:CGFloat = 4.0
...
let planeGeometry = SCNNode(geometry: SCNPlane(width: theSize, height: theSize))

【讨论】:

    【解决方案2】:

    如果你将你的楼层节点添加到rootNode,你的Y位置应该改变:

    planeNode.position = SCNVector3(planeAnchor.center.x, -1.0, planeAnchor.center.z)
    

    在这种情况下,我使用了负一米^

    您可以使用表面检测来找到您的地板表面锚点,然后将您的地板添加到此锚点的相关节点中。锚点的世界坐标已经正确(减去Y),因此您可以使用SCNVector3Zero 作为您的地板位置。

    【讨论】:

    • 为什么是任意的-1?
    • @LimThyeChean 仅用于测试。您应该使用表面检测并首先找到真实的地板坐标。然后你将使用Y 真实楼层的坐标。
    猜你喜欢
    • 2021-08-15
    • 2017-06-06
    • 2016-12-13
    • 2017-11-27
    • 2018-04-12
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多