来自 ARKit 的四舍五入位置数据

Posted

技术标签:

【中文标题】来自 ARKit 的四舍五入位置数据【英文标题】:Rounding positional data from ARKit 【发布时间】:2021-07-27 08:29:33 【问题描述】:

我有这段代码可以从 ARKit 中的每一帧获取 X、Y、Z 位置。

let CamPosition = SCNVector3(transform.m41, transform.m42, transform.m43)

我如何将数字四舍五入,因为它们偶尔会以这样的科学计数法输出?

SCNVector3(x: 7.276927e-09, y: 2.4679738e-09, z: 3.395949e-10)

而不是像这样的期望输出:

SCNVector3(x: 0.026048008, y: 0.0069037788, z: 0.010655182)

非常感谢任何帮助!

【问题讨论】:

my answer 不起作用吗? 您的答案有效,但我仍然得到极小数字的科学记数法。我想看看四舍五入是否能解决这个问题。 【参考方案1】:

四舍五入到米

为此,您可以使用三种神圣的方法:round(_:)、ceil(_:) 和 floor(_:)。

import SceneKit
import Foundation

let node = SCNNode()

node.position = SCNVector3(x: floor(12.856288),
                           y:  ceil(67.235459),
                           z: round(34.524305))


node.position.x    //  12
node.position.y    //  68   
node.position.z    //  35

将 XYZ 值四舍五入为整数,使它们以米为单位间歇(离散)转换。

四舍五入到厘米

将 XYZ 值四舍五入到小数点后 2 位:

node.position = SCNVector3(x: round(12.856288 * 100) / 100.0,
                           y: round(67.235459 * 100) / 100.0,
                           z: round(34.524305 * 100) / 100.0)

node.position.x    //  12.86   (hundredths)
node.position.y    //  67.24
node.position.z    //  34.52

【讨论】:

【参考方案2】:

在我看来,您正在尝试修复不需要修复的问题。

从very comprehensive answer 可以看出,计算机不擅长存储一些十进制数字,所以你得到的是可以用二进制表示的最近邻。

除非这会导致您出现功能问题,否则我建议您忽略它。如果问题是您的调试日志中包含不易解析的数字,请使用数字格式化程序。

【讨论】:

感谢您的回答!问题是我正在将此数据传递给其他人编写的 python 脚本。这些数字给他们带来了他们说他们无法解决的错误,这就是我在这里尝试这样做的原因。

以上是关于来自 ARKit 的四舍五入位置数据的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIKit-UIPageControl利用delegate定位圆点位置 之 四舍五入小技巧

C语言 如何实现保留三位小数,第四位四舍五入的程序

Postgres / Rails Active Record - 查询四舍五入的浮点值

皕杰报表(知识小结)

JS-特效 ~ 02. 屏幕滚动事件 DTDscroll顶部悬浮导航两侧跟随广告返回顶部小火煎

Android - 在 SQLite 数据库中保存位置