zho*_*hua 3 augmented-reality raycasting swift arkit realitykit
RealityKit框架中检测交叉点的方法一共有三种,但是我不知道如何在我的项目中使用它。
1.
func raycast(origin: SIMD3<Float>,
direction: SIMD3<Float>,
length: Float,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
Run Code Online (Sandbox Code Playgroud)
2.
func raycast(from: SIMD3<Float>,
to: SIMD3<Float>,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
Run Code Online (Sandbox Code Playgroud)
3.
func convexCast(convexShape: ShapeResource,
fromPosition: SIMD3<Float>,
fromOrientation: simd_quatf,
toPosition: SIMD3<Float>,
toOrientation: simd_quatf,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity?) -> [CollisionCastHit]
Run Code Online (Sandbox Code Playgroud)
如果您想了解如何使用 Ray-Casting 方法将在 Reality Composer 中制作的模型定位到 RealityKit 场景(具有检测到的水平面)中,请使用以下代码:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
注意一个班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 */
Run Code Online (Sandbox Code Playgroud)
一个CollisionCastHit结构是碰撞投命中结果,它生活在RealityKit的场景。
聚苯乙烯
当您使用
raycast(from:to:query:mask:relativeTo:)方法来测量从相机到实体的距离时,ARCamera的方向无关紧要,重要的是它在世界坐标中的位置。
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |