ARKit SCNVector3 和扩展不能一起工作 [英] ARKit SCNVector3 and extensions not working together

查看:34
本文介绍了ARKit SCNVector3 和扩展不能一起工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have an app that that aims to record the camera's current X,Y,Z coordinates and print them out. It does this properly with the code down below

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)

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

I want to truncate the printed output since it's very long. I found this extension to truncate the values.

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

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

This works if I print something like this:

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

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

but will not work if I print it out like this:

print(camRotation.truncate(palces:2))

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

The error it gives me says "Value of type 'SCNVector4' has no member 'truncate'"

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

is this a formatting issue on my end or do SCNVectors just not allow you to use extensions?

推荐答案

'SCNVector4'类型的值没有成员'truncate'"

"Value of type 'SCNVector4' has no member 'truncate'"

camRotation 是一个 SCNVector4.

您的扩展程序位于 Double,而不是 SCNVector4.

Your extension is on Double, not 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) 不起作用,因为类型不匹配.

Extensions work on any type, but camRotation.truncate(palces:2) doesn't work, because the type doesn't match.

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

Ok, now on to the actual answer. Currently, your code says

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

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

Just apply truncate to each of the components:

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

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

Because these components take in Float values, you should also change your extension to this:

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

这篇关于ARKit SCNVector3 和扩展不能一起工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆