RealityKit - 错误的 ModelEntity 位置
RealityKit – Wrong ModelEntity position
我使用 RealityKit composer 在 RealityKit 文件中创建了一个简单的场景:
然后我创建了一个 arView
并将其添加到它的锚点我场景的锚点:
arView.scene.anchors.append(ARSceneViewModel().sceneAnchor)
我创建了一个 ARSceneViewModel
class 来设置我的场景。
当我 运行 我的应用程序时,这是我看到的:
但是当我在 ARSceneViewModel
中动态更改实体的文本时:
我认为这些行有问题(可能是因为场景的层次结构):
private func updateScene() {
self.sceneAnchor.text?.children[0].children[0].components.set(generateModelComponentForText(text: "Hello"))
}
这是场景的层次结构:
这里是更改实体文本的函数:
private func generateModelComponentForText(text: String, size: CGFloat = 0.02, extrusion: Float = 0.0003) -> ModelComponent {
let mesh: MeshResource = .generateText(text,
extrusionDepth: 0.001,
font: .systemFont(ofSize: 0.06),
containerFrame: CGRect.zero,
alignment: .center,
lineBreakMode: .byWordWrapping)
let material: [Material] = [SimpleMaterial(color: .black, isMetallic: true)]
return ModelComponent(mesh: mesh, materials: material)
}
当我 运行 应用时:
好的,我没想到。我不明白为什么它不是文本实体不以场景为中心。我更改了它的文本,而不是它的位置。
有什么建议吗?
在这里你可以download the project。 (WeTransfer)
您可以使用以下逻辑轻松地将新文本居中:
import Cocoa
import RealityKit
class ViewController: NSViewController {
@IBOutlet var arView: ARView!
override func awakeFromNib() {
arView.environment.background = .color(.black)
let scenePlate = try! Experience.loadPlate()
arView.scene.anchors.append(scenePlate)
print(scenePlate)
// Text replacement and centering
let text = scenePlate.findEntity(named: "simpBld_text") as! ModelEntity
text.model?.mesh = .generateText("Hello",
extrusionDepth: 0.05,
font: .systemFont(ofSize: 0.35))
let boundingBox: BoundingBox? = text.model?.mesh.bounds
let coord = ((boundingBox?.max)! - (boundingBox?.min)!) / 2
text.position = -1 * [coord.x, coord.y, coord.z]
text.position.y -= 0.07
}
}
这是场景层次结构:
▿ '' : Plate, children: 1
⟐ SynchronizationComponent
⟐ Transform
⟐ AnchoringComponent
▿ '' : AnchorEntity, children: 2
⟐ SynchronizationComponent
⟐ Transform
⟐ AnchoringComponent
▿ '' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'sign' : Entity, children: 4
⟐ SynchronizationComponent
⟐ Transform
▿ 'squareNoEditBorder_1' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_root' : ModelEntity
⟐ ModelComponent
⟐ SynchronizationComponent
⟐ Transform
▿ 'squareNoEditFace_1' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_root' : ModelEntity
⟐ ModelComponent
⟐ SynchronizationComponent
⟐ Transform
▿ 'squareNoEditGround_1' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_root' : ModelEntity
⟐ ModelComponent
⟐ SynchronizationComponent
⟐ Transform
▿ 'squareText_1' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_root' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_text' : ModelEntity
⟐ ModelComponent
⟐ SynchronizationComponent
⟐ Transform
▿ 'Ground Plane' : Entity
⟐ SynchronizationComponent
⟐ CollisionComponent
⟐ Transform
⟐ PhysicsBodyComponent
我使用 RealityKit composer 在 RealityKit 文件中创建了一个简单的场景:
然后我创建了一个 arView
并将其添加到它的锚点我场景的锚点:
arView.scene.anchors.append(ARSceneViewModel().sceneAnchor)
我创建了一个 ARSceneViewModel
class 来设置我的场景。
当我 运行 我的应用程序时,这是我看到的:
但是当我在 ARSceneViewModel
中动态更改实体的文本时:
我认为这些行有问题(可能是因为场景的层次结构):
private func updateScene() {
self.sceneAnchor.text?.children[0].children[0].components.set(generateModelComponentForText(text: "Hello"))
}
这是场景的层次结构:
这里是更改实体文本的函数:
private func generateModelComponentForText(text: String, size: CGFloat = 0.02, extrusion: Float = 0.0003) -> ModelComponent {
let mesh: MeshResource = .generateText(text,
extrusionDepth: 0.001,
font: .systemFont(ofSize: 0.06),
containerFrame: CGRect.zero,
alignment: .center,
lineBreakMode: .byWordWrapping)
let material: [Material] = [SimpleMaterial(color: .black, isMetallic: true)]
return ModelComponent(mesh: mesh, materials: material)
}
当我 运行 应用时:
好的,我没想到。我不明白为什么它不是文本实体不以场景为中心。我更改了它的文本,而不是它的位置。 有什么建议吗?
在这里你可以download the project。 (WeTransfer)
您可以使用以下逻辑轻松地将新文本居中:
import Cocoa
import RealityKit
class ViewController: NSViewController {
@IBOutlet var arView: ARView!
override func awakeFromNib() {
arView.environment.background = .color(.black)
let scenePlate = try! Experience.loadPlate()
arView.scene.anchors.append(scenePlate)
print(scenePlate)
// Text replacement and centering
let text = scenePlate.findEntity(named: "simpBld_text") as! ModelEntity
text.model?.mesh = .generateText("Hello",
extrusionDepth: 0.05,
font: .systemFont(ofSize: 0.35))
let boundingBox: BoundingBox? = text.model?.mesh.bounds
let coord = ((boundingBox?.max)! - (boundingBox?.min)!) / 2
text.position = -1 * [coord.x, coord.y, coord.z]
text.position.y -= 0.07
}
}
这是场景层次结构:
▿ '' : Plate, children: 1
⟐ SynchronizationComponent
⟐ Transform
⟐ AnchoringComponent
▿ '' : AnchorEntity, children: 2
⟐ SynchronizationComponent
⟐ Transform
⟐ AnchoringComponent
▿ '' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'sign' : Entity, children: 4
⟐ SynchronizationComponent
⟐ Transform
▿ 'squareNoEditBorder_1' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_root' : ModelEntity
⟐ ModelComponent
⟐ SynchronizationComponent
⟐ Transform
▿ 'squareNoEditFace_1' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_root' : ModelEntity
⟐ ModelComponent
⟐ SynchronizationComponent
⟐ Transform
▿ 'squareNoEditGround_1' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_root' : ModelEntity
⟐ ModelComponent
⟐ SynchronizationComponent
⟐ Transform
▿ 'squareText_1' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_root' : Entity, children: 1
⟐ SynchronizationComponent
⟐ Transform
▿ 'simpBld_text' : ModelEntity
⟐ ModelComponent
⟐ SynchronizationComponent
⟐ Transform
▿ 'Ground Plane' : Entity
⟐ SynchronizationComponent
⟐ CollisionComponent
⟐ Transform
⟐ PhysicsBodyComponent