Ios Swift SCNNode 3D立方体旋转到立方体上的一点

Ios Swift SCNNode 3D立方体旋转到立方体上的一点,ios,swift,scenekit,Ios,Swift,Scenekit,问题:尝试将立方体旋转到立方体本身上的某个点。该点是随机创建的,应该出现在屏幕的中心 尝试使用lookAtConstraint并在func渲染器中(renderer:SCNSceneRenderer,UpdateAtime:TimeInterval)指定了随机点。但不起作用(评论) 还尝试先获取偏差中心点(初始[0,0,距中心的距离]),然后在func渲染器中cube.eulerAngles=deviation(\urenderer:SCNSceneRenderer,updateatime:Ti

问题:尝试将立方体旋转到立方体本身上的某个点。该点是随机创建的,应该出现在屏幕的中心

尝试使用lookAtConstraint并在
func渲染器中(renderer:SCNSceneRenderer,UpdateAtime:TimeInterval)
指定了随机点。但不起作用(评论)


还尝试先获取偏差中心点(初始[0,0,距中心的距离]),然后在
func渲染器中
cube.eulerAngles=deviation
(\urenderer:SCNSceneRenderer,updateatime:TimeInterval)
。但立方体是随机旋转的。

我想出了一个简单的3D几何解决方案。可能还有其他优雅的解决方案。 以下是我如何做到的-

建立了两个效用函数,得到两点夹角的asin和acos组合-

func angleBetweenVectorsCos(_ vectorB:SCNVector3) -> SCNFloat {
        let cosineAngle = (dot(vector: vectorB) / (magnitude * vectorB.magnitude))
        return SCNFloat(acos(cosineAngle))
}

func angleBetweenVectorsSin(_ vectorB:SCNVector3) -> SCNFloat {
        let cosineAngle = angleBetweenVectorsCos(vectorB)
        let sinangle = sqrt(1-cosineAngle*cosineAngle)
        return SCNFloat(acos(sinangle))
 }
然后-在
func渲染器中(\renderer:SCNSceneRenderer,updateatime:TimeInterval)
function I计算指定的角度

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
        if time > rotationTimer{


            let angleCos = lastposition.angleBetweenVectorsCos(movingTarget.position)
            let angleSin = lastposition.angleBetweenVectorsSin(movingTarget.position)
            SCNTransaction.begin()
            SCNTransaction.animationDuration = 0.5
            xDegree += angleSin
            yDegree += angleCos
            zDegree += 0

            if vMove {
                cube.eulerAngles.x =  xDegree
            }
            if hMove {
                cube.eulerAngles.y =  -yDegree
            }


            SCNTransaction.commit()
            lastposition = movingTarget.position
            .......    
            rotationTimer = time + 0.2
        }

    }
如何获得vMove(垂直移动)和hMove(水平移动)-通过检测与原点的距离来计算移动对象所在的曲面


我做了一个完整的github回购

我想出了一个简单的3D几何解决方案。可能还有其他优雅的解决方案。 以下是我如何做到的-

建立了两个效用函数,得到两点夹角的asin和acos组合-

func angleBetweenVectorsCos(_ vectorB:SCNVector3) -> SCNFloat {
        let cosineAngle = (dot(vector: vectorB) / (magnitude * vectorB.magnitude))
        return SCNFloat(acos(cosineAngle))
}

func angleBetweenVectorsSin(_ vectorB:SCNVector3) -> SCNFloat {
        let cosineAngle = angleBetweenVectorsCos(vectorB)
        let sinangle = sqrt(1-cosineAngle*cosineAngle)
        return SCNFloat(acos(sinangle))
 }
然后-在
func渲染器中(\renderer:SCNSceneRenderer,updateatime:TimeInterval)
function I计算指定的角度

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
        if time > rotationTimer{


            let angleCos = lastposition.angleBetweenVectorsCos(movingTarget.position)
            let angleSin = lastposition.angleBetweenVectorsSin(movingTarget.position)
            SCNTransaction.begin()
            SCNTransaction.animationDuration = 0.5
            xDegree += angleSin
            yDegree += angleCos
            zDegree += 0

            if vMove {
                cube.eulerAngles.x =  xDegree
            }
            if hMove {
                cube.eulerAngles.y =  -yDegree
            }


            SCNTransaction.commit()
            lastposition = movingTarget.position
            .......    
            rotationTimer = time + 0.2
        }

    }
如何获得vMove(垂直移动)和hMove(水平移动)-通过检测与原点的距离来计算移动对象所在的曲面

我做了一个完整的github回购