ARKit SCNVector3 和扩展不能一起工作

问题描述

我有一个应用程序,旨在记录相机当前的 X、Y、Z 坐标并将它们打印出来。它使用下面的代码正确地做到了这一点

func renderer(_ renderer: SCNSceneRenderer,willRenderScene scene: SCNScene,atTime time: TimeInterval) {

        guard let pointOfView = sceneView.pointOfView else { return }
        let transform = pointOfView.transform
        let CamPosition = SCNVector3(transform.m41,transform.m42,transform.m43)
        print(CamPosition)

我想截断打印的输出,因为它很长。我发现这个扩展可以截断值。

extension Double {
    func truncate(places : Int)-> Double {
        return Double(floor(pow(10.0,Double(places)) * self)/pow(10.0,Double(places)))
    }
}

如果我打印这样的东西,这会起作用:

x = 1.123456789
print(x.truncate(places: 2))

但如果我像这样打印出来将无法工作:

print(camRotation.truncate(palces:2))

它给我的错误是“'SCNVector4'类型的值没有成员'truncate'”

这是我的格式问题还是 SCNVectors 不允许您使用扩展?

解决方法

“'SCNVector4' 类型的值没有成员 'truncate'”

camRotation 是一个 SCNVector4

您的分机位于 Double,而不是 SCNVector4

          /// Double,not SCNVector4
extension Double {
    func truncate(places : Int)-> Double {
        return Double(floor(pow(10.0,Double(places)) * self)/pow(10.0,Double(places)))
    }
}

扩展适用于任何类型,但 camRotation.truncate(palces:2) 不起作用,因为类型不匹配。


好的,现在进入实际答案。目前,您的代码说

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

只需将 truncate 应用于每个组件:

let CamPosition = SCNVector3(
    transform.m41.truncate(places: 2),transform.m42.truncate(places: 2),transform.m43.truncate(places: 2)
)
print(CamPosition)

因为这些组件接受 Float 值,您还应该将扩展名更改为:

extension Float {
    func truncate(places: Int) -> Float {
        return Float(floor(pow(10.0,Float(places)) * self)/pow(10.0,Float(places)))
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...