首页 > 解决方案 > SceneKit 将对象移动到另一个对象之上

问题描述

我是 SceneKit 的新手,我正在编写游戏。我已将两个对象加载到我的场景中。第一个物体不动,只有第二个。这两个对象总是必须粘在一起,但第二个对象可以根据用户输入在第一个对象的表面上完全自由移动(基本上就像两个具有无穷大能量但没有摩擦的磁铁)。我的方法是获取第二个对象的 x 和 y 坐标,并查看给定 x 和 y 坐标处对象的 z 坐标是什么。然后我将对象二移动到完全相同的 z 坐标。

我尝试使用 SCNDistanceConstraint 但没有任何效果:

let cnstrnt = SCNDistanceConstraint(target: object1)
    cnstrnt.maximumDistance = 1
    cnstrnt.minimumDistance = 0.99
    object2?.constraints?.append(cnstrnt)

我也尝试使用 SCNTransformConstraint 也没有任何效果:

 let transform = SCNTransformConstraint.positionConstraint(inWorldSpace: true) { (object2, vector) -> SCNVector3 in
       let z = object1?.worldPosition.z
        return SCNVector3(object2.worldPosition.x, object2.worldPosition.y, z!)
    }
    object2?.constraints?.append(transform)

使用 hitTest 仅返回位于对象边界框上的结果,而不是其实际表面:

let hitTest = mySceneView.scene?.physicsWorld.rayTestWithSegment(from: SCNVector3((object2?.position.x)!, (object2?.position.y)!, -10), to: (object2?.position)!, options: nil)

那么如何从 ax 和 y 坐标中获取 3d 对象表面的 z 坐标呢?因为那样我就可以手动设置 object2 的新位置。也许你有另一种比我更优雅、更快的方法?

预先感谢!

标签: iosswift3dscenekit

解决方案


推荐阅读