Как использовать методы Raycast в RealityKit?
Есть три способа обнаружения перекрестков в RealityKit
framework, но я не знаю, как использовать его в своем проекте.
1.
func raycast(origin: SIMD3<Float>,
direction: SIMD3<Float>,
length: Float,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
2.
func raycast(from: SIMD3<Float>,
to: SIMD3<Float>,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
3.
func convexCast(convexShape: ShapeResource,
fromPosition: SIMD3<Float>,
fromOrientation: simd_quatf,
toPosition: SIMD3<Float>,
toOrientation: simd_quatf,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
1 ответ
Простой Ray-Casting
Если вы хотите узнать, как разместить модель, созданную в Reality Composer, в сцене RealityKit (с обнаруженной горизонтальной плоскостью) с помощью метода Ray-Casting, используйте следующий код:
import RealityKit
import ARKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
let scene = try! Experience.loadScene()
@IBAction func onTap(_ sender: UITapGestureRecognizer) {
scene.steelBox!.name = "Parcel"
let tapLocation: CGPoint = sender.location(in: arView)
let estimatedPlane: ARRaycastQuery.Target = .estimatedPlane
let alignment: ARRaycastQuery.TargetAlignment = .horizontal
let result: [ARRaycastResult] = arView.raycast(from: tapLocation,
allowing: estimatedPlane,
alignment: alignment)
guard let rayCast: ARRaycastResult = result.first
else { return }
let anchor = AnchorEntity(world: rayCast.worldTransform)
anchor.addChild(scene)
arView.scene.anchors.append(anchor)
print(rayCast)
}
}
Обратите внимание на класс ARRaycastQuery
. Этот класс происходит от ARKit, а не от RealityKit.
Литье выпуклых лучей
Методы Convex-Ray-Casting, такие как
raycast(from:to:query:mask:relativeTo:)
Операция по перемещению выпуклой формы по прямой и остановке на самом первом пересечении с любой формой столкновения в сцене. Место действияraycast()
выполняет проверку попадания для всех сущностей сcollision shapes
в сцене. Сущности без формы столкновения игнорируются.
Вы можете использовать следующий код для выполнения преобразования с выпуклым лучом от начальной позиции до конца:
import RealityKit
let startPosition: SIMD3<Float> = [0, 0, 0]
let endPosition: SIMD3<Float> = [5, 5, 5]
let query: CollisionCastQueryType = .all
let mask: CollisionGroup = .all
let raycasts: [CollisionCastHit] = arView.scene.raycast(from: startPosition,
to: endPosition,
query: query,
mask: mask,
relativeTo: nil)
guard let rayCast: CollisionCastHit = raycasts.first
else { return }
print(rayCast.distance) /* The distance from the ray origin to the hit */
print(rayCast.entity.name) /* The entity's name that was hit */
А CollisionCastHit
Структура - это результат столкновения, и она живет в сцене RealityKit.
PS
Когда вы используете
raycast(from:to:query:mask:relativeTo:)
Метод измерения расстояния от камеры до объекта не имеет значения, в какой ориентации камера ARCamera, имеет значение только ее положение в мировых координатах.