我需要从我最初设置的场景视图中的位置旋转一个 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)
}