我是如何做到这一点的-
建立了两个效用函数来获取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(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
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回购。
See this and suggest some improvements