Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make Text to have the same position and orientation as Box?

I am using RealityKit and struggling to set text which should readable and placed on a box. No matter how the box was set, It should always follow the position of the box.

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)

The above code gives me the wrong result. The result I want can be seen in the attached image.

enter image description here

like image 826
indrajit Avatar asked Oct 19 '25 13:10

indrajit


1 Answers

It's easy. Just make a text to be a child of cube and pin that cube with anchor. In ECS frameworks child always copy from its parent position, orientation and scale.

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

Now child always follows his parent.

enter image description here

like image 140
Andy Jazz Avatar answered Oct 22 '25 04:10

Andy Jazz