带有 SceneKit 的 ARKit 广告牌效果
ARKit billboarding effect with SceneKit
我希望添加类似于此应用程序的广告牌效果:https://twitter.com/marpi_/status/897130955105644544
我希望使用 SCNText 几何图形的 SCNode 始终面向相机。
我尝试过但没有成功:
- SCNLookAtConstraint 以 sceneView.pointOfView 为目标,但这会将节点旋转为背对相机,导致文本向后,并且无法更改节点位置或欧拉角。
开箱即用,SKLabelNode 将始终面向 ARKit 中的相机,这正是我想要的,除了使用 SCNText。
更新代码
let textGeometry = SCNText(string: "Hello, World!", extrusionDepth: 1.0)
textGeometry.font = UIFont(name: "Arial", size: 2)
textGeometry.firstMaterial!.diffuse.contents = UIColor.red
let textNode = SCNNode(geometry: textGeometry)
// Update object's pivot to its center
//
let (min, max) = textGeometry.boundingBox
let dx = min.x + 0.5 * (max.x - min.x)
let dy = min.y + 0.5 * (max.y - min.y)
let dz = min.z + 0.5 * (max.z - min.z)
textNode.pivot = SCNMatrix4MakeTranslation(dx, dy, dz)
textNode.scale = SCNVector3(0.01, 0.01, 0.01)
let plane = SCNPlane(width: 0.2, height: 0.2)
let blueMaterial = SCNMaterial()
blueMaterial.diffuse.contents = UIColor.blue
plane.firstMaterial = blueMaterial
let parentNode = SCNNode(geometry: plane) // this node will hold our text node
let yFreeConstraint = SCNBillboardConstraint()
yFreeConstraint.freeAxes = .Y // optionally
parentNode.constraints = [yFreeConstraint] // apply the constraint to the parent node
parentNode.position = SCNVector3(0, 0, -0.5)
parentNode.addChildNode(textNode)
sceneView.scene.rootNode.addChildNode(parentNode) // add our text holder to the scene
似乎将广告牌约束直接应用于文本节点会重置其位置和比例,因此文本节点会变大并相对于相机定位在 0,0,0 处。不知道为什么 :( 但是将约束应用于父节点工作正常。
你快到了!
只需修改文本的节点轴使其旋转 180 度 (Obj-C)。
node.pivot = SCNMatrix4MakeRotation(M_PI, 0, 1, 0);
我希望添加类似于此应用程序的广告牌效果:https://twitter.com/marpi_/status/897130955105644544
我希望使用 SCNText 几何图形的 SCNode 始终面向相机。
我尝试过但没有成功:
- SCNLookAtConstraint 以 sceneView.pointOfView 为目标,但这会将节点旋转为背对相机,导致文本向后,并且无法更改节点位置或欧拉角。
开箱即用,SKLabelNode 将始终面向 ARKit 中的相机,这正是我想要的,除了使用 SCNText。
更新代码
let textGeometry = SCNText(string: "Hello, World!", extrusionDepth: 1.0)
textGeometry.font = UIFont(name: "Arial", size: 2)
textGeometry.firstMaterial!.diffuse.contents = UIColor.red
let textNode = SCNNode(geometry: textGeometry)
// Update object's pivot to its center
//
let (min, max) = textGeometry.boundingBox
let dx = min.x + 0.5 * (max.x - min.x)
let dy = min.y + 0.5 * (max.y - min.y)
let dz = min.z + 0.5 * (max.z - min.z)
textNode.pivot = SCNMatrix4MakeTranslation(dx, dy, dz)
textNode.scale = SCNVector3(0.01, 0.01, 0.01)
let plane = SCNPlane(width: 0.2, height: 0.2)
let blueMaterial = SCNMaterial()
blueMaterial.diffuse.contents = UIColor.blue
plane.firstMaterial = blueMaterial
let parentNode = SCNNode(geometry: plane) // this node will hold our text node
let yFreeConstraint = SCNBillboardConstraint()
yFreeConstraint.freeAxes = .Y // optionally
parentNode.constraints = [yFreeConstraint] // apply the constraint to the parent node
parentNode.position = SCNVector3(0, 0, -0.5)
parentNode.addChildNode(textNode)
sceneView.scene.rootNode.addChildNode(parentNode) // add our text holder to the scene
似乎将广告牌约束直接应用于文本节点会重置其位置和比例,因此文本节点会变大并相对于相机定位在 0,0,0 处。不知道为什么 :( 但是将约束应用于父节点工作正常。
你快到了!
只需修改文本的节点轴使其旋转 180 度 (Obj-C)。
node.pivot = SCNMatrix4MakeRotation(M_PI, 0, 1, 0);