我需要将可以自由旋转的模型旋转到精确的角度,而不管旋转了多少次。

我有一个UIPanGestureRecognizer,它可以围绕Y轴自由旋转3D模型。但是,当平移停止时,我正在努力将其锁定到整数度,并且正在努力知道它在0-359之间的度数旋转。

let translation = recognizer.translation(in: self.view)

var newAngleY = Double(translation.x) * (Double.pi) / 180.0
newAngleY += self.currentAngle

self.shipNode?.eulerAngles.y = Float(newAngleY)

if (recognizer.state == .ended)
{
   self.currentAngle = newAngleY
}


它可以自由旋转,但是所有尝试将其锁定到最接近的精确度,并且能够“知道”其旋转度为0-359。

我知道:

let degrees = newAngleY * ( 180 / Double.pi)


而且我知道,如果度> 360,则-= 360(伪代码)

但是,虽然UIPanGestureRecognizer正在执行此操作,但这些检查似乎失败了,我不知道为什么。是否是因为它仍在平移时无法编辑ViewController的私有属性?

最佳答案

您可以在手势发生时编辑该值。

有很多选择,因此这似乎是最简单的开始:

您可以尝试仅在状态更改时应用euler,并且仅在.x> .x *(某些值,例如1.1)时应用。这将提供一种更“贴切”的方法,例如:

 var currentLocation = CGPoint.zero
 var beginLocation = CGPoint.zero

 @objc func handlePan(recognizer: UIPanGestureRecognizer) {
    currentLocation = recognizer.location(in: gameScene)

    var newAngleY = Double(translation.x) * (Double.pi) / 180.0
    newAngleY += self.currentAngle

    switch recognizer.state
    {
     case UIGestureRecognizer.State.began: break
     case UIGestureRecognizer.State.changed:
         if(currentLocation.x > beginLocation.x * 1.1)
         {
           gNodes.bnode.eulerAngles.y = Float(newAngleY)
           beginLocation.x = currentLocation.x
         }
         if(currentLocation.x < beginLocation.x * 0.9) { .etc. }
         break
         case UIGestureRecognizer.State.ended:
           gNodes.bnode.eulerAngles.y = Float(newAngleY)
           break
    }
}


然后,您可以切换到SCNAction(更改数学)以提供更多控制权,例如

let vAction = SCNAction.rotateTo(x: 0, y: vAmount, z: 0, duration: 0)
bnode.runAction(vAction)

关于swift - 如何按度旋转和锁定SCNNode的旋转?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56485685/

10-16 17:02