(斯威夫特 4)
嘿,如果您想将对象放置在相对于另一个节点(例如相机节点)的某个位置并且与参考节点的方向相同,则可以使用这个更简单的功能:
func updatePositionAndOrientationOf(_ node: SCNNode, withPosition position: SCNVector3, relativeTo referenceNode: SCNNode) {
let referenceNodeTransform = matrix_float4x4(referenceNode.transform)
// Setup a translation matrix with the desired position
var translationMatrix = matrix_identity_float4x4
translationMatrix.columns.3.x = position.x
translationMatrix.columns.3.y = position.y
translationMatrix.columns.3.z = position.z
// Combine the configured translation matrix with the referenceNode's transform to get the desired position AND orientation
let updatedTransform = matrix_multiply(referenceNodeTransform, translationMatrix)
node.transform = SCNMatrix4(updatedTransform)
}
如果你想把'node'放在某个'cameraNode'前面2m,你可以这样称呼它:
let position = SCNVector3(x: 0, y: 0, z: -2)
updatePositionAndOrientationOf(node, withPosition: position, relativeTo: cameraNode)
编辑:获取相机节点
要获取相机节点,这取决于您使用的是 SceneKit、ARKit 还是其他框架。以下是 ARKit 和 SceneKit 的示例。
使用 ARKit,您可以使用 ARSCNView 渲染与相机内容重叠的 SCNScene 的 3D 对象。您可以从 ARSCNView 的 pointOfView 属性中获取相机节点:
let cameraNode = sceneView.pointOfView
对于 SceneKit,您有一个渲染 SCNScene 的 3D 对象的 SCNView。您可以创建相机节点并将它们放置在您想要的任何位置,因此您可以执行以下操作:
let scnScene = SCNScene()
// (Configure scnScene here if necessary)
scnView.scene = scnScene
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(0, 5, 10) // For example
scnScene.rootNode.addChildNode(cameraNode)
设置好相机节点后,您可以像 ARKit 一样访问当前相机:
let cameraNode = scnView.pointOfView