Swift 3 - SceneKit 获取 3d 模型比例值

Posted

技术标签:

【中文标题】Swift 3 - SceneKit 获取 3d 模型比例值【英文标题】:Swift 3 - SceneKit Get 3d model scale value 【发布时间】:2017-11-19 08:51:16 【问题描述】:

我正在尝试获取加载到sceneView 中的 3d 对象的值,同时使用两根手指对其进行缩放。我可以正确获取rotationpositionorientation,但是scale 始终保持在1

我怎样才能得到这个值?

var update = Timer()

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        sceneView.scene = SCNScene(named: "PKB2");
        sceneView.debugOptions.insert(SCNDebugOptions.showWireframe)
        sceneView.autoenablesDefaultLighting = true
        sceneView.allowsCameraControl = true

        update = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.updateFunc), userInfo: nil, repeats: true)

     

func updateFunc() 

        var eulerAngles_x = Double((sceneView.pointOfView?.eulerAngles.x)!) * (180.0 / Double.pi)
        if( eulerAngles_x < 0 ) eulerAngles_x += 360.0

        var eulerAngles_y = Double((sceneView.pointOfView?.eulerAngles.y)!) * (180.0 / Double.pi)
        if( eulerAngles_y < 0 ) eulerAngles_y += 360.0

        var eulerAngles_z = Double((sceneView.pointOfView?.eulerAngles.z)!) * (180.0 / Double.pi)
        if( eulerAngles_z < 0 ) eulerAngles_z += 360.0

        x_lbl.text = String(format:"%.2f", eulerAngles_x)
        y_lbl.text = String(format:"%.2f", eulerAngles_y)
        z_lbl.text = String(format:"%.2f", eulerAngles_z)
        w_lbl.text = String(format:"%.2f", (sceneView.pointOfView?.scale.z)!)

        print(sceneView.pointOfView?.scale) // not changing while scaling the object

    

【问题讨论】:

【参考方案1】:

使用sceneView.allowsCameraControl = true 时,您是在操作相机,而不是对象。您的 3D 对象没有移动,相机正在围绕它移动。

因此检查相机的比例是错误的,因为比例没有改变,只是放大了。

尝试检查sceneView.pointOfView?.camera.xFovsceneView.pointOfView?.camera.yFov


另外值得注意的是,allowsCameraControl 状态的文档:

请注意,此属性的主要目的是帮助调试 你的申请。您可能想要实现自己的相机控制器 适合您的应用。

【讨论】:

谢谢。我了解您指出正在移动的实际上是相机视图。使用 xFov 我可以看到相机变焦。那么我应该如何控制物体而不是相机的旋转和缩放?您可以指出我的任何堆栈或教程吗? 将您自己的手势识别器添加到场景中以进行平移和捏合,并使用平移和缩放值。您可能仍想移动相机而不是对象,但使用您自己的手势会给您更多的控制权。

以上是关于Swift 3 - SceneKit 获取 3d 模型比例值的主要内容,如果未能解决你的问题,请参考以下文章

在 SceneKit/modelIO 中测量 3D-Obj 文件上两点之间的距离并显示它们

在 Swift SceneKit 中使用 CAKeyframeAnimation 为 SCN 对象设置动画

SceneKit 移动相机

将scenekit和spritekit组合在一个屏幕中

SceneKit 与 Vuforia AR 库自定义模型

Scenekit:如何获取节点的所有材质?