热门标签 | 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


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • imnewtotheswiftandxcodeworld,soimhavingaproblemtryingtointegrateapackagetomypro ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 设计模式实现对象的复用——享元模式的概述和角色解析
    本文介绍了设计模式中的享元模式,该模式通过共享技术实现了大量细粒度对象的复用,从而提高系统性能。文章详细解析了享元模式的概述和角色,包括抽象享元类、具体享元类和非共享享元类。通过本文的阅读,读者可以了解享元模式的原理和应用场景,从而在实际开发中更好地利用该模式实现对象的复用。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 我创建了一个新的AWSSSO(使用内部IDP作为身份源,因此不使用ActiveDirectory)。我能够登录AWSCLI、AWSGUI,但 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • 一、命名规范1、变量--首写是小写字母。变量用来储存游戏状态中的任何信息。2、函数--首写是大写字母。函数是一个代码块,只需要写一次,在需要时候可以被再 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
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社区 版权所有