Swift 在RealityKit中实现十字线类行为
我想要实现的目标:将一个球体连接到相机位置(以便在设备移动时始终保持在屏幕中心),并检测它何时位于其他AR对象的顶部-以触发AR对象上的其他动作/行为 方法:我已经创建了球体并连接到屏幕中心,如下所示Swift 在RealityKit中实现十字线类行为,swift,augmented-reality,arkit,realitykit,reality-composer,Swift,Augmented Reality,Arkit,Realitykit,Reality Composer,我想要实现的目标:将一个球体连接到相机位置(以便在设备移动时始终保持在屏幕中心),并检测它何时位于其他AR对象的顶部-以触发AR对象上的其他动作/行为 方法:我已经创建了球体并连接到屏幕中心,如下所示 @IBOutlet var arView: ARView! override func viewDidLoad() { super.viewDidLoad() let mesh = MeshResource.generateSphere(radius: 0.1) let
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
let mesh = MeshResource.generateSphere(radius: 0.1)
let sphere = ModelEntity(mesh: mesh)
let anchor = AnchorEntity(.camera)
sphere.setParent(anchor)
arView.scene.addAnchor(anchor)
sphere.transform.translation.z = -0.75
}
下一步,在会话中执行hittest或光线投射(\uuU2dUpdate:)
但我不断地得到地平面作为我的结果与这种方法。我有没有遗漏什么,或者有不同的方法来实现这一点
注意:为了以防万一,我创建了我的基本场景,因为我想在Reality Composer中跟踪图像并在图像标记上添加内容,并且使用Xcode中的.rcproject还为所有覆盖的项目启用了冲突属性。尝试以下解决方案:
import ARKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
var sphere: ModelEntity?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = arView.center
let results: [CollisionCastHit] = arView.hitTest(touch)
if let result: CollisionCastHit = results.first {
if result.entity.name == "Cube" && sphere?.isAnchored == true {
print("BOOM!")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Crosshair
let mesh01 = MeshResource.generateSphere(radius: 0.01)
sphere = ModelEntity(mesh: mesh01)
sphere?.transform.translation.z = -0.15
let cameraAnchor = AnchorEntity(.camera)
sphere?.setParent(cameraAnchor)
arView.scene.addAnchor(cameraAnchor)
// Model for collision
let mesh02 = MeshResource.generateBox(size: 0.3)
let box = ModelEntity(mesh: mesh02, materials: [SimpleMaterial()])
box.generateCollisionShapes(recursive: true)
box.name = "Cube"
let planeAnchor = AnchorEntity(.plane(.any,
classification: .any,
minimumBounds: [0.2, 0.2]))
box.setParent(planeAnchor)
arView.scene.addAnchor(planeAnchor)
}
}
导入ARKit
进口商品
类ViewController:UIViewController{
@ibvar arView:arView!
VarSphere:ModelEntity?
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
让触摸=arView.center
let results:[CollisionCastHit]=arView.hitTest(触摸)
如果let result:CollisionCastHit=results.first{
如果result.entity.name==“Cube”&&sphere?.isAnchored==true{
打印(“砰!”)
}
}
}
重写func viewDidLoad(){
super.viewDidLoad()
//十字线
设mesh01=MeshResource.generateSphere(半径:0.01)
球体=模型实体(网格:mesh01)
球体?.transform.translation.z=-0.15
让cameraAnchor=AnchoreEntity(.camera)
球体?.setParent(cameraAnchor)
arView.scene.addAnchor(cameraAnchor)
//碰撞模型
设mesh02=MeshResource.generateBox(大小:0.3)
长方体=模型实体(网格:mesh02,材质:[SimpleMaterial()])
generateCollisionShapes(递归:true)
box.name=“多维数据集”
设平面锚定=锚定实体(.plane(.any),
分类:。任何,
最小边界:[0.2,0.2]))
box.setParent(平面锚定)
arView.scene.addAnchor(平面锚)
}
}
您的对象是否有碰撞组件?hitTest的文档说它将忽略没有实体的实体。我已经调用了实体。generateCollisionShapes(recursive:true)
,还启用了Physics->Reality Composer中的碰撞形状。你好,Andy,感谢您的快速响应。但此时您需要检查是否点击了立方体。我试图实现的是,如果场景中已经有一个球体(放置在摄影机位置),我想检查在任何给定时间,来自球体位置的光线是否与立方体相交。基本上任何时候相机都可以直接(看着)与立方体对齐。可能是我接近它的方式是错误的&有一种更好的方法可以得到相机直接看到的东西,以及在它的直线视图中是否有AR对象。我希望这能让我的问题更清楚。非常感谢。我刚刚通过了上面代码中的touch=arView.center
,它工作得非常好。再次感谢你!
import ARKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
var sphere: ModelEntity?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = arView.center
let results: [CollisionCastHit] = arView.hitTest(touch)
if let result: CollisionCastHit = results.first {
if result.entity.name == "Cube" && sphere?.isAnchored == true {
print("BOOM!")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Crosshair
let mesh01 = MeshResource.generateSphere(radius: 0.01)
sphere = ModelEntity(mesh: mesh01)
sphere?.transform.translation.z = -0.15
let cameraAnchor = AnchorEntity(.camera)
sphere?.setParent(cameraAnchor)
arView.scene.addAnchor(cameraAnchor)
// Model for collision
let mesh02 = MeshResource.generateBox(size: 0.3)
let box = ModelEntity(mesh: mesh02, materials: [SimpleMaterial()])
box.generateCollisionShapes(recursive: true)
box.name = "Cube"
let planeAnchor = AnchorEntity(.plane(.any,
classification: .any,
minimumBounds: [0.2, 0.2]))
box.setParent(planeAnchor)
arView.scene.addAnchor(planeAnchor)
}
}