1

我需要从我最初设置的场景视图中的位置旋转一个 SCNText 对象。当我创建 SCNText 时,我会调整它的枢轴点,以便它在它的中心上旋转。问题是在我这样做之后它会自行移动到它的 leftAlignment 角。我用一个红点来创建这个点

在此处输入图像描述

如果没有下面的代码,它会错误地旋转(从左对齐角),如图 1 所示。使用此代码,它确实从中心正确旋转,但它的原始位置现在是错误的,如图 2 所示。

let min = textNode.boundingBox.min
let max = textNode.boundingBox.max
textNode.pivot = SCNMatrix4MakeTranslation(
    min.x + (max.x - min.x)/2,
    min.y + (max.y - min.y)/2,
    min.z + (max.z - min.z)/2
)

我在找第三张图。我怎样才能做到这一点?

代码:

let squareNode = SCNNode()
squareNode ...
squareNode.position = SCNVector3(0.0, 0.6, -0.7)

let material = SCNMaterial()
material.diffuse.contents = UIColor.yellow

let geometry = SCNText(string: "SCNText", extrusionDepth: 0.1)
geometry.flatness = 0
geometry.font = UIFont.systemFont(ofSize: 6.3)
geometry.materials = [material]

let textNode = SCNNode()
textNode.geometry = geometry
textNode.geometry?.firstMaterial?.isDoubleSided = true

// *** code to use its center ***
let min = textNode.boundingBox.min
let max = textNode.boundingBox.max
textNode.pivot = SCNMatrix4MakeTranslation(
    min.x + (max.x - min.x)/2,
    min.y + (max.y - min.y)/2,
    min.z + (max.z - min.z)/2
)

textNode.position = SCNVector3(0.1, 0.55, -0.7)
sceneView.scene.rootNode.addChildNode(textNode)

当我第一次创建 textNode 时,我还尝试不添加“使用其中心的代码”,而是在旋转发生在内部时添加代码,respondToSwipeGesture但是一旦旋转完成,它就会结束/移动到与相同的 leftAlignment 角如图2所示。

func respondToSwipeGesture(recognizer: UIGestureRecognizer) {

    case UISwipeGestureRecognizer.Direction.right:

    // ...

    let node = hitResults.first.node

    let rotate = SCNAction.rotateBy(x: 0, y: CGFloat(degToRadians(degrees: -68.5)), z: 0, duration: 0.33)

    let min = node.boundingBox.min
    let max = node.boundingBox.max
    node.pivot = SCNMatrix4MakeTranslation(
        min.x + (max.x - min.x)/2,
        min.y + (max.y - min.y)/2,
        min.z + (max.z - min.z)/2
    )

    node.runAction(rotate)
}
4

0 回答 0