如何使 Text 与 Box 具有相同的位置和方向?
How to make Text to have the same position and orientation as Box?
我正在使用 RealityKit 并努力设置应可读并放置在框上的文本。无论盒子怎么设置,它都应该跟随盒子的位置。
let textMesh = MeshResource.generateText("ABC", extrusionDepth: 0.001, font: fonts)
let textEntity = ModelEntity(mesh: textMesh, materials: [UnlitMaterial(color: .black)])
let boxMeshForText = MeshResource.generateBox(width: 0.25,
height: 0.1,
depth: 0,
cornerRadius: 0.001)
let boxEntityForText = ModelEntity(mesh: boxMeshForText,
materials: [UnlitMaterial(color: UIColor.white)])
textEntity.setPosition([-0.09, -0.03, 0.001], relativeTo: boxEntityForText)
boxEntityForText.addChild(textEntity)
let textAnchor = ARAnchorEntity()
textAnchor.addChild(boxEntityForText, preservingWorldTransform: true)
textAnchor.setPosition([0.05, 0.05, 0.02], relativeTo: anchor)
textAnchor.transform.rotation = simd_quatf(angle: -90 * .pi/180, axis: [1,0,0])
anchor.addChild(textAnchor)
上面的代码给了我错误的结果。我想要的结果可以在附图中看到。
很简单。只需将文本设为 child 的立方体,然后用锚固定该立方体。在 ECS 框架中 child 始终从其 parent 位置、方向和比例进行复制。
let box = MeshResource.generateBox(size: 1)
let boxEntity = ModelEntity(mesh: box)
let anchor = AnchorEntity()
boxEntity.setParent(anchor)
arView.scene.addAnchor(anchor)
let text = MeshResource.generateText("AR",
extrusionDepth: 0.01,
font: .systemFont(ofSize: 0.25),
containerFrame: .zero,
alignment: .center,
lineBreakMode: .byWordWrapping)
let shader = UnlitMaterial(color: .yellow)
let textEntity = ModelEntity(mesh: text, materials: [shader])
textEntity.position.z += 0.6
// Changing a position, orientation and scale of the parent
boxEntity.addChild(textEntity)
boxEntity.transform = Transform(pitch: .pi/8, yaw: .pi/8, roll: .pi/8)
boxEntity.position.x = -0.5
boxEntity.scale /= 2
现在child总是跟着他的parent。
谢谢@Andy Fedoroff 的回答。
通过学习你的建议,我得到了结果,这是我使用的代码。
let boxDepth: Float = 0.25
let textBoxMesh = MeshResource.generateBox(width: 0.1,
height: 0.01,
depth: 0.25,
cornerRadius: 0.02)
let textBoxEntity = ModelEntity.init(mesh: textBoxMesh,
materials: [UnlitMaterial(color: UIColor.white)])
textBoxEntity.position = .init(boxDepth/2, 0, 0)
anchor.addChild(textBoxEntity)
let fonts: UIFont = .init(descriptor: .init(name: "Helvetica", size: 0),
size: 0.06)
let textToDisplay = meterToDisplayText(meters: meters)
let textMesh = MeshResource.generateText(textToDisplay,
extrusionDepth: 0.001,
font: fonts)
let textEntity = ModelEntity(mesh: textMesh, materials: [UnlitMaterial(color: .black)])
textEntity.transform = Transform(pitch: -90 * .pi/180,
yaw: -90 * .pi/180,
roll: 0)
textBoxEntity.addChild(textEntity)
我正在使用 RealityKit 并努力设置应可读并放置在框上的文本。无论盒子怎么设置,它都应该跟随盒子的位置。
let textMesh = MeshResource.generateText("ABC", extrusionDepth: 0.001, font: fonts)
let textEntity = ModelEntity(mesh: textMesh, materials: [UnlitMaterial(color: .black)])
let boxMeshForText = MeshResource.generateBox(width: 0.25,
height: 0.1,
depth: 0,
cornerRadius: 0.001)
let boxEntityForText = ModelEntity(mesh: boxMeshForText,
materials: [UnlitMaterial(color: UIColor.white)])
textEntity.setPosition([-0.09, -0.03, 0.001], relativeTo: boxEntityForText)
boxEntityForText.addChild(textEntity)
let textAnchor = ARAnchorEntity()
textAnchor.addChild(boxEntityForText, preservingWorldTransform: true)
textAnchor.setPosition([0.05, 0.05, 0.02], relativeTo: anchor)
textAnchor.transform.rotation = simd_quatf(angle: -90 * .pi/180, axis: [1,0,0])
anchor.addChild(textAnchor)
上面的代码给了我错误的结果。我想要的结果可以在附图中看到。
很简单。只需将文本设为 child 的立方体,然后用锚固定该立方体。在 ECS 框架中 child 始终从其 parent 位置、方向和比例进行复制。
let box = MeshResource.generateBox(size: 1)
let boxEntity = ModelEntity(mesh: box)
let anchor = AnchorEntity()
boxEntity.setParent(anchor)
arView.scene.addAnchor(anchor)
let text = MeshResource.generateText("AR",
extrusionDepth: 0.01,
font: .systemFont(ofSize: 0.25),
containerFrame: .zero,
alignment: .center,
lineBreakMode: .byWordWrapping)
let shader = UnlitMaterial(color: .yellow)
let textEntity = ModelEntity(mesh: text, materials: [shader])
textEntity.position.z += 0.6
// Changing a position, orientation and scale of the parent
boxEntity.addChild(textEntity)
boxEntity.transform = Transform(pitch: .pi/8, yaw: .pi/8, roll: .pi/8)
boxEntity.position.x = -0.5
boxEntity.scale /= 2
现在child总是跟着他的parent。
谢谢@Andy Fedoroff 的回答。
通过学习你的建议,我得到了结果,这是我使用的代码。
let boxDepth: Float = 0.25
let textBoxMesh = MeshResource.generateBox(width: 0.1,
height: 0.01,
depth: 0.25,
cornerRadius: 0.02)
let textBoxEntity = ModelEntity.init(mesh: textBoxMesh,
materials: [UnlitMaterial(color: UIColor.white)])
textBoxEntity.position = .init(boxDepth/2, 0, 0)
anchor.addChild(textBoxEntity)
let fonts: UIFont = .init(descriptor: .init(name: "Helvetica", size: 0),
size: 0.06)
let textToDisplay = meterToDisplayText(meters: meters)
let textMesh = MeshResource.generateText(textToDisplay,
extrusionDepth: 0.001,
font: fonts)
let textEntity = ModelEntity(mesh: textMesh, materials: [UnlitMaterial(color: .black)])
textEntity.transform = Transform(pitch: -90 * .pi/180,
yaw: -90 * .pi/180,
roll: 0)
textBoxEntity.addChild(textEntity)