热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在sceneView.session.setWorldOrigin转换之后,ARKit节点消失》经验,需要怎么解决?

我有一些代码,包含用于获取标题的委托方法和转换.我取标题并将其转换为弧度并使用角度围绕y轴旋转:

    ?                             ?
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因为当我删除它时,我看到节点,它们仍然存在.

UPDATE

我一直在研究这个...我正在通过简单地尝试将比例改为2进行调试......我应该看到的是,我放置在网格中的节点应该分散...但是我仍然得到相同的结果.尝试setWorldOrigin删除节点后.使用此功能会重置某些内容吗?我应该使用它吗?(一些代表职能)?

UPDATE

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

 --- rootNode in renderer

所以看来它rootNode和它children仍然在某个地方......但它们在哪里进行如此简单的小变换呢?

UPDATE

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

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

然而......我没有看到任何一个孩子......所以rootNode似乎在其他地方.

UPDATE

我可以确认转换没有发生......子节点(我看不到)的位置仍然与其原始状态(每2个网格块(米)的节点相同,即:

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

UPDATE

我现在对这个问题的最狭隘观点是,即使是简单的旋转也会从视图中移除节点......因为没有位置变化......这意味着我认为渲染过程正在发生一些事情.

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

尽管如此,虚拟对象仍然不可见,但放置在原点......它应该仍然是相同的.

我还应该注意标准1,1,1,1变换DOES工作......但很明显,它什么也没做......但我想只是使用这个功能不会让它们消失......它们只会消失转换实际上做了什么......

...

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)

...

上面没有变换......并且节点保持在视图中.

如果我将矩阵更改为此(翻译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]

有用...

我只是想......我必须缩小我的世界(现实世界的MKMapKit坐标/单位)可能是因为硬件无法处理缩放的世界.另外,从上面的测试...我想我已经意识到当你使用这个函数时原点会移动,但是节点没有,所以如果我希望节点在转换后保持在我的位置......我需要把它们变回来.不过,结果是一样的:

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

UPDATE

我看到了我的对象(有点)!我以为我之前尝试过这个...但它现在工作得更好 - 我使用的代码包定义了一个scale(coordinateConverter.unitSizeInMeters)......而且我正在转换它不正确.但是......他们快速地闪烁着......

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))
}

UPDATE

闪烁的"z-fighting"?https://en.wikipedia.org/wiki/Z-fighting


推荐阅读
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • SDWebImage第三方库学习
    1、基本使用方法异步下载并缓存-(void)sd_setImageWithURL:(nullableNSURL*)urlNS_REFINED_FOR_SWIFT;使用占位图片& ... [详细]
  • iOS如何实现手势
    这篇文章主要为大家展示了“iOS如何实现手势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文详细探讨了 Android Service 组件中 onStartCommand 方法的四种不同返回值及其应用场景。Service 可以在后台执行长时间的操作,无需提供用户界面,支持通过启动和绑定两种方式创建。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 深入理解iOS中的链式编程:以Masonry为例
    本文通过介绍Masonry这一轻量级布局框架,探讨链式编程在iOS开发中的应用。Masonry不仅简化了Auto Layout的使用,还提高了代码的可读性和维护性。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 解决UIBarButtonItem 边缘显示异常的问题分析与优化方案
    在iOS开发中,针对UIBarButtonItem边缘显示异常的问题进行了深入分析,并提出了一系列优化方案。通过自定义视图和调整布局约束,有效解决了按钮在不同设备和屏幕尺寸下的显示问题,提升了用户体验。具体方法包括使用AutoLayout进行动态调整,以及对按钮的内边距和外边距进行精细控制,确保按钮在各种场景下都能保持良好的视觉效果。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
author-avatar
爱情只有确定键没有取消键_874
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有