缩放节点的问题(.simdPivot与simdScale和.scale属性)

时间:2019-05-07 18:53:14

标签: ios swift scenekit augmented-reality arkit

我不了解节点上的节点缩放如何工作。

我试图了解Apple Creating Face Based AR Experiences示例项目中的代码是如何工作的。具体来说,我试图了解TransformVisualization.swift文件及其应用于其节点的转换。

调用方法addEyeTransformNodes(),并且使用simdScale属性缩放左右眼节点。那就是我感到困惑的部分。

我尝试使用.scale和.simdScale属性缩放同一节点,但是它们两者均不执行任何操作。

此外,更令人困惑的事实是,即使.simdPivot的值大于1,节点也会按比例缩小。我希望节点可以扩展。

为什么我们需要设置.simdPivot来缩放节点,而不设置.scale和.simdScale属性?

这是我正在谈论的功能。

func addEyeTransformNodes() {
  guard #available(iOS 12.0, *), let anchorNode = contentNode else { return }

  // Scale down the coordinate axis visualizations for eyes.
  rightEyeNode.simdPivot = float4x4(diagonal: float4(3, 3, 3, 1))
  leftEyeNode.simdPivot = float4x4(diagonal: float4(3, 3, 3, 1))

  anchorNode.addChildNode(rightEyeNode)
  anchorNode.addChildNode(leftEyeNode)
}

这是我尝试过的:

func addEyeTransformNodes() {
  guard #available(iOS 12.0, *), let anchorNode = contentNode else { return }

  // Does nothing
  rightEyeNode.simdScale = float3(3, 3, 3)
  // Does nothing
  leftEyeNode.scale = SCNVector3(x: 3, y: 3, z: 3)

  anchorNode.addChildNode(rightEyeNode)
  anchorNode.addChildNode(leftEyeNode)
}

我希望按照自己的方式缩放节点,但是什么也没发生。

期待您的回答和帮助。

1 个答案:

答案 0 :(得分:0)

如果需要偏移枢轴(在应用旋转和/或缩放之前),请使用simdPivot实例属性。

使用我的测试代码来了解其工作原理:

let sphereNode1 = SCNNode(geometry: SCNSphere(radius: 1))
sphereNode1.geometry?.firstMaterial?.diffuse.contents = UIColor.red
sphereNode1.position = SCNVector3(-5, 0, 0)
scene.rootNode.addChildNode(sphereNode1)

let sphereNode2 = SCNNode(geometry: SCNSphere(radius: 1))
sphereNode2.geometry?.firstMaterial?.diffuse.contents = UIColor.green
sphereNode2.simdPivot.columns.3.x = -1

sphereNode2.scale = SCNVector3(2, 2, 2)           // WORKS FINE
//sphereNode2.simdScale = float3(2, 2, 2)         // WORKS FINE

scene.rootNode.addChildNode(sphereNode2)

let sphereNode3 = SCNNode(geometry: SCNSphere(radius: 1))
sphereNode3.geometry?.firstMaterial?.diffuse.contents = UIColor.blue
sphereNode3.position = SCNVector3(5, 0, 0)
scene.rootNode.addChildNode(sphereNode3)

枢轴偏移为x: -1

enter image description here

枢轴偏移为x: 0

enter image description here

  

使用init(diagonal:)初始化程序可帮助您创建一个新的4x4 Matrix,并在主对角线上指定矢量。此方法有一个问题:当您分配大于1的对角线值时,它将按比例缩小对象,反之亦然。 因此,如果您想放大角色的眼睛,请使用以下方法作为解决方法

rightEyeNode.simdPivot = float4x4(diagonal: float4(1/3, 1/3, 1/3, 1))
leftEyeNode.simdPivot = float4x4(diagonal: float4(1/3, 1/3, 1/3, 1))

我认为Apple工程师将来会解决此问题。

希望这会有所帮助。