gpt4 book ai didi

swift - 如何旋转并锁定SCNNode的旋转角度?

转载 作者:行者123 更新时间:2023-11-30 10:42:30 26 4
gpt4 key购买 nike

我需要将一个可以自由旋转的模型旋转到精确的角度,无论它旋转了多少次。

我有一个 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的私有(private)属性?

最佳答案

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

有很多选项,所以这似乎是最简单的开始:

您可以尝试仅在状态更改时且仅在 .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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com