Ios 在SceneKit中,斯威夫特试图通过触摸移动角色

Ios 在SceneKit中,斯威夫特试图通过触摸移动角色,ios,swift,scenekit,Ios,Swift,Scenekit,我找不到一个最新的、不在目标c中的答案。我在swift中使用SceneKit,并试图将我的角色节点移动到用户单击的位置。我尝试在触摸开始时使用“点击结果”,但我的楼层节点位于(0,0,0),因此当它点击用户在屏幕上单击的大部分时间时,它是无用的。我正要拿出我的旧微积分书,但后来我意识到,当触摸位置总是相对于在场景中移动的屏幕位置时,我不知道如何转换。如果有人能给我看一个链接或给我一些建议,我将不胜感激。要在视图坐标和场景坐标之间转换,您可以使用场景渲染器的projectPoint和unproje

我找不到一个最新的、不在目标c中的答案。我在swift中使用SceneKit,并试图将我的角色节点移动到用户单击的位置。我尝试在触摸开始时使用“点击结果”,但我的楼层节点位于(0,0,0),因此当它点击用户在屏幕上单击的大部分时间时,它是无用的。我正要拿出我的旧微积分书,但后来我意识到,当触摸位置总是相对于在场景中移动的屏幕位置时,我不知道如何转换。如果有人能给我看一个链接或给我一些建议,我将不胜感激。

要在视图坐标和场景坐标之间转换,您可以使用场景渲染器的projectPoint和unprojectPoint方法,请参阅

它们将允许您在场景的三维坐标系和视图的二维坐标系之间以任意方式转换点

更新


您要做的是调用unproject函数两次,一次将z设置为零(使用x/y视图坐标),一次将其设置为一。这将在3d世界中给你2个点,想象它们之间有一条线,你需要计算出这条线与你的楼层平面相交的位置。这就是您需要的要点。

谢谢,我现在看到文档了。不过我还是很困惑,为什么这个论点是一个“改革者”?我试图从一个CGPoint(这是我从触摸中获得的全部)转到一个SCNVector3.fun unprojectPoint(SCNVector3)。这是因为屏幕上的一个点指向三维世界中的一条线,您可以设置一个介于0和1之间的值,以指定该点在三维世界中沿线的位置(在近剪裁平面和远剪裁平面之间)。有关详细信息,请参阅文档。如果需要有关代码的帮助,可以询问有关堆栈溢出的更具体问题。如果我的回答有帮助,请将其标记为已接受,谢谢:)好的,你已经帮助了很多人,我几乎让它工作了,但我在裁剪平面部分做错了什么。角色移动的距离比单击的距离远我希望它与地板平面相交的点成为向量上获取坐标的点。let touch=touch.first!let location=touch.location(in:scnView)let hit=scnView.unjectpoint(SCNVector3Make(Float(location.x)、Float(location.y)、0))let moveToVector=SCNVector3Make(hit.x、0、hit.z)