首页 文章

sceneView.session.setWorldOrigin 转换后,ARKit 节点消失

提问于
浏览
5

我有一些代码,其中包括用于获取标题的委托方法和一个转换。我将标题转换为弧度,并使用角度围绕 y-axis 旋转:

┌                             ┐
Y = |  cos(ry)    0   sin(ry)   0 |
    |  0          1   0         0 |
    |  -sin(ry)   0   cos(ry)   0 |
    |  0          0   0         1 |
    └                             ┘

SCNMatrix4 的前两列是什么

码:

func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
        print("received heading: \(String(describing: newHeading))")
        self.currentHeading = newHeading
        print("\(Float(currentHeading.trueHeading)) or for magneticHeading: \(currentHeading.magneticHeading)")
        let headingInRadians = degreesToRadians(deg: Float(currentHeading.trueHeading))
        print("\(headingInRadians) -------- headingInRadians")

        var m = matrix_float4x4()
        m.columns.3 = [0.0, 0.0, 0.0, 1.0]
        m.columns.2 = [sin(headingInRadians), 0.0, cos(headingInRadians), 0.0]
        m.columns.1 = [0.0, 1.0, 0.0, 0.0]
        m.columns.0 = [cos(headingInRadians), 0.0, -sin(headingInRadians), 0.0]

        sceneView.session.setWorldOrigin(relativeTransform: m)
    }

当我调用setWorldOrigin时,它将删除所有节点。我尝试暂停会话,运行该功能,然后再次启动该会话,但出现这种奇怪的奇怪的低 fps,低照度的情况。我知道这是对setWorldOrigin的函数调用,因为当我删除它时,我看到了节点并且它们持续存在。

更新

我一直在 this...I 调试中,只是尝试通过 2...all 来更改比例。我应该看到发生的事情是我放置在网格中的节点应该传播 out...however 我仍然得到相同的结果。尝试setWorldOrigin之后,将删除节点。使用此功能会重置某些内容吗?我应该使用一个特殊的地方吗? (一些委托功能)?

更新

print("\(sceneView.scene.rootNode) --- rootNode in renderer")产生:

<SCNNode: 0x1c01f8100 | 111 children> --- rootNode in renderer

因此,看来rootNode及其children仍然是 somewhere...but,通过这样一个简单而小的转换它们会去哪里?

更新

print("\(sceneView.scene.rootNode.position) --- rootNode in renderer")产生:

SCNVector3(x: 0.0, y: 0.0, z: 0.0) --- rootNode in renderer

Yet...I 看不到 children...so,rootNode 似乎不在其他地方。

更新

我可以确认转换不是 happening...the 子节点(我看不到)的位置仍与其原始状态相同(每 2 个网格块(米)i.e。一个节点):

SCNVector3(x: 6.0, y: 0.0, z: -4.0) --- rootNode child node
SCNVector3(x: 6.0, y: 0.0, z: -2.0) --- rootNode child node

更新

我现在对这个问题的最狭窄的看法是,即使是简单的旋转也可以从 view...since 上删除节点,而没有位置 change...this 意味着我相信渲染过程正在进行。

func viewDidLoad() {    

    ...

    sceneView.scene = scene
    view.addSubview(sceneView)

    let angle = coordinateConverter.getUprightMKMapCameraHeading()
    print("\(angle) --- angle")

    mRotate = matrix_float4x4()
    mRotate.columns.3 = [0.0, 0.0, 0.0, 1.0]
    mRotate.columns.2 = [Float(sin(angle)), 0.0, Float(cos(angle)), 0.0]
    mRotate.columns.1 = [0.0, 0.0, 0.0, 0.0]
    mRotate.columns.0 = [Float(cos(angle)), 0.0, Float(-sin(angle)), 0.0]

    sceneView.session.setWorldOrigin(relativeTransform: mRotate)

控制台输出:

281.689248803283 --- angle

尽管如此,虚拟对象仍然不可见,但放置在 origin...which 上的虚拟对象仍应相同。

我还应该注意的是,标准的 1,1,1,1 转换显然是 work...but,它确实是 nothing...but,我猜只是使用该函数并不会使它们 disappear...they 仅在您的转换实际执行了某些操作时才会消失...

...

var identity = matrix_float4x4()
identity.columns.3 = [0.0, 0.0, 0.0, 1.0]
identity.columns.2 = [0.0, 0.0, 1.0, 0.0]
identity.columns.1 = [0.0, 1.0, 0.0, 0.0]
identity.columns.0 = [1.0, 0.0, 0.0, 0.0]

sceneView.session.setWorldOrigin(relativeTransform: identity)

...

上面的转换 nothing...and 节点仍在视图中。

如果我将矩阵更改为此(转换为 10,10):

var identity = matrix_float4x4()
identity.columns.3 = [10.0, 0.0, 10.0, 1.0]
identity.columns.2 = [0.0, 0.0, 1.0, 0.0]
identity.columns.1 = [0.0, 1.0, 0.0, 0.0]
identity.columns.0 = [1.0, 0.0, 0.0, 0.0]

有用...

我只是在想...我是否必须缩小我的世界(real-world MKMapKit coordinates/unit),也许是因为硬件无法处理缩放后的世界。同样,从上面的 test...I 那里我认为当您使用此功能时原点会移动,但节点不会移动,因此如果我希望节点在 transform...and 之后保持在我的位置,则需要将它们变回原位。仍然,结果是相同的:

print("\(transformerFromPDFToMk.tx) -- tx")
print("\(transformerFromPDFToMk.ty) -- ty")

m = matrix_float4x4()
m.columns.3 = [Float(transformerFromPDFToMk.tx), 0.0, Float(transformerFromPDFToMk.ty), 1.0]
m.columns.2 = [0.0, 0.0, 1.0, 0.0]
m.columns.1 = [0.0, 1.0, 0.0, 0.0]
m.columns.0 = [1.0, 0.0, 0.0, 0.0]

sceneView.session.setWorldOrigin(relativeTransform: m)

for node in scene.rootNode.childNodes {
    node.position = SCNVector3Make(-Float(transformerFromPDFToMk.tx) + node.position.x, node.position.y, Float(transformerFromPDFToMk.ty) + node.position.z)
}

控制台输出:

81145547.3824476 -- tx
99399579.5362287 -- ty

更新

我看到我的对象(种类)!我以为我现在尝试过此 before...but 的效果要好一些-我使用的代码包定义了一个比例尺(coordinateConverter.unitSizeInMeters )...and 我没有正确地转换为它。But...they 迅速闪烁进出...

m = matrix_float4x4()
m.columns.3 = [Float(transformerFromPDFToMk.tx) / Float(coordinateConverter.unitSizeInMeters), 0.0, Float(transformerFromPDFToMk.ty) / Float(coordinateConverter.unitSizeInMeters), 1.0]
m.columns.2 = [0.0, 0.0, 1.0, 0.0]
m.columns.1 = [0.0, 1.0, 0.0, 0.0]
m.columns.0 = [1.0, 0.0, 0.0, 0.0]

sceneView.session.setWorldOrigin(relativeTransform: m)

sceneView.session.setWorldOrigin(relativeTransform: m)

for node in scene.rootNode.childNodes {
    node.position = SCNVector3Make(-Float(transformerFromPDFToMk.tx) / 
       Float(coordinateConverter.unitSizeInMeters) + node.position.x / 
       Float(coordinateConverter.unitSizeInMeters), node.position.y / 
       Float(coordinateConverter.unitSizeInMeters), -
       Float(transformerFromPDFToMk.ty) / 
       Float(coordinateConverter.unitSizeInMeters) + node.position.z / 
       Float(coordinateConverter.unitSizeInMeters))
}

更新

是闪烁的“ z-fighting”吗? https://en.wikipedia.org/wiki/Z-fighting

2 回答

  • 3

    解决缩放问题之后,我减小了世界的大小(缩放),并将对象彼此分开一些(以修复闪烁的“ z-fighting”)-维基百科的页面非常有用,我敢肯定我要做的是缩小世界尺寸。

  • 0

    嘿看完代码后,我发现您为围绕 y-axis 旋转设置了 4x4 矩阵错误。

    您目前有。

    var m = matrix_float4x4()
    m.columns.3 = [0.0, 0.0, 0.0, 1.0]
    m.columns.2 = [sin(headingInRadians), 0.0, cos(headingInRadians), 0.0]
    m.columns.1 = [0.0, 1.0, 0.0, 0.0]
    m.columns.0 = [cos(headingInRadians), 0.0, -sin(headingInRadians), 0.0]
    

    正确的格式如下,基于交易所:https://math.stackexchange.com/questions/72014/given-an-angle-in-radians-how-could-i-calculate-a-4x4-rotation-matrix-about-the

    var m = matrix_float4x4()
    m.columns.3 = [0.0, 0.0, 0.0, 1.0]
    m.columns.2 = [-sin(headingInRadians), 0.0, cos(headingInRadians), 0.0]
    m.columns.1 = [0.0, 1.0, 0.0, 0.0]
    m.columns.0 = [cos(headingInRadians), 0.0, sin(headingInRadians), 0.0]
    

    这应该使它为您工作。

    根据您要对场景进行的处理,我建议采用当前航向与上一个航向之间的差值并将其用作角度。从理论上讲,这应该使它始终对您来说是朝着相同的方向。

相关问题