Ios Swift SCNNode 3D立方体旋转到立方体上的一点
问题:尝试将立方体旋转到立方体本身上的某个点。该点是随机创建的,应该出现在屏幕的中心 尝试使用lookAtConstraint并在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
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回购