SCNNode查看当前位置并始终相对向上

时间:2019-02-05 21:25:27

标签: ios swift rotation arkit scnnode

问题:

无论电话的方向如何,我都试图使节点的视线始终指向电话的北极。假设节点在中心,电话从(0, 0, 10)开始,并假定节点的几何形状类似于电话。我希望该矩形的顶部始终相对于我所在的位置指向“上方”。

所以我们有

let node = SCNNode()
node.position = SCNVector3(0, 0, 0)

self.sceneView.pointOfView.position = (0, 0, 10)

//The top of the node should be pointing towards (0, 100, 0) and 
//should be facing the phone.

Initial Position

现在让我们移至self.sceneView.pointOfView.position = (10, 0, 0),我们将希望节点跟随并绕Y轴旋转90度。

node.eulerAngles.y = Float(90*Double.pi/180)

change to X axis

现在让我们在电话上移动到位置self.sceneView.pointOfView.position = (0, 10, 0)

我们绕着Y轴进行了90度的初始旋转,现在我们从当前位置开始绕着原始X轴或当前Z轴进行了旋转。 (我之所以这样说是因为我愿意就如何解决这个问题提出建议,并且我希望对此有所了解)。

现在我们有了

node.eulerAngles.x = Float(90*Double.pi/180)

,并且我们的节点相对于我们的位置指向“ UP”;也就是说,我们在节点的前面,并且节点根据我们过去的转换指向“ UP”。

enter image description here

我的努力:

我尝试使用node.look(at:, up:, localFront:)无济于事。我尝试过

node.look(at: self.sceneView.pointOfView!.position, up: self.sceneView.pointOfView.worldUp, localFront: SCNNode.localFront)

但这会导致node在我旋转手机时移动,并且我不希望这种情况发生。我不希望node从横向旋转到人像旋转,也不想node旋转。

问题:

如何使节点始终从我的位置指向上方并始终看着我,而我在旋转手机时却不移动,旋转或转弯?我只想要X和Y动作。我愿意接受任何建议。

1 个答案:

答案 0 :(得分:0)

func carouselLookAtMe() {
    //Here we use tangent lines on a sphere, relating to the POSITIVE Y Axis, to find the point at which the up direction is.
    let currentPos = self.sceneView.pointOfView!.position
    let D:Float = pow(currentPos.x, 2) + pow(currentPos.y, 2) + pow(currentPos.z, 2)

    let newPos = SCNVector3(0, abs(Float(D/Float(currentPos.y))), 0)
    let xDiff = currentPos.x-self.carousel.position.x
    let yDiff = currentPos.y-self.carousel.position.y
    let zDiff = currentPos.z-self.carousel.position.z

    let upVectorPos = SCNVector3(newPos.x-xDiff, newPos.y-yDiff, newPos.z-zDiff)
    self.carousel.look(at: self.sceneView.pointOfView!.position, up: upVectorPos, localFront: SCNVector3(0, 0, 1))
}

注意:self.carousel是我要查看的节点。相对来说,它一直看着我,同时朝上。

我在func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)之内称呼它