ARKit与SceneKit结合实现广告牌效果

5

我想添加一个类似于这个应用程序的广告牌效果:https://twitter.com/marpi_/status/897130955105644544

我希望使用SCNText几何图形的SCNodes始终面向相机。

我尝试了以下方法,但没有成功:

  • 使用sceneView.pointOfView作为目标的SCNLookAtConstraint,但是这会将节点旋转到面向相反方向,导致文本倒置,并且无法更改节点的位置或欧拉角。

在ARKit中,SKLabelNode默认始终面向相机,这正是我想要的,只不过使用SCNText。

2个回答

9

你应该查看 SCNBillboardConstraint

更新代码

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
// https://dev59.com/h6Pia4cB1Zd3GeqPrwTR
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。不知道为什么 :( 但是将约束应用于父节点则正常工作。


对我来说,这似乎比使用查看约束+枢轴更好的解决方案,但出于某些原因,我无法让“textNode”在场景中显示。 - klmitchell2
我的 textNode 也无法通过 SCNBillboardConstraint 显示出来!有人成功了吗? - Nestor
我认为应该是:billboardConstraint.freeAxes = [.Y] - Tomasz Kasperek
尝试这个:https://github.com/subham-choudhary/ARKitINNAV/blob/1e8be99705b213fa5ec1d4c9ef8b551b903dac54/INNAV/TextNode.swift - johndpope

5

你已经接近成功了!

只需修改文本节点的中心点,将其旋转180度(Obj-C)即可。

node.pivot = SCNMatrix4MakeRotation(M_PI, 0, 1, 0);

谢谢!这个按预期工作了。我之前尝试了旋转(rotation)和按旋转(rotateby),但都没成功。 - klmitchell2
你可能也想看一下 SCNBillboardConstraint ,而不是使用 SCNLookAtConstraint。 - Bersaelor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接