我正在遵循 Google 的地理空间示例,并在给定坐标处成功创建了 3D 模型网格。 现在我已经实现了命中测试并获得结果,但我不知道如何检测它是否击中网格
我尝试过这样的代码但没有成功
if (motionEvent != null) {
//val hitResultList = frame.hitTestInstantPlacement(motionEvent!!.x, motionEvent!!.y, 2.0f)
val hitResultList = frame.hitTest(motionEvent)
val debug = hitResultList.toString()
if (hitResultList.size > 0) {
Log.d(TAG, debug)
for (hit in hitResultList){
val trackable = hit.trackable
Log.d(TAG, trackable.toString())
if (hit.equals(virtualObjectMesh)){
Log.d(TAG, "tapped!")
}
if (hit.equals(earthAnchor)){
Log.d(TAG, "tapped!")
}
}
}
motionEvent = null
}
从我在文档中看到的内容(“ARCore / 在 Android 应用程序中执行命中测试”),检测
HitTest
结果是否命中 ARCore 或类似 AR 中给定的 Mesh
对象平台上,您需要将从命中结果中获得的 Trackable
与 Mesh
的实例或您感兴趣的对象进行比较。
但是,使用 HitResult
直接比较
Mesh
对象与您的
equals
并不是正确的方法,因为 HitResult
和您的 Mesh
对象是不同类型的对象。HitResult
的 type,看看它是否属于您期望的类型(例如,
Plane
或 Point
),并且那么,如果您的 Mesh
对象附加到 Anchor
或具有一些可识别的特征,您应该使用这些来确定命中测试是否与您的 Mesh
相交。
if (motionEvent != null) {
val hitResultList = frame.hitTest(motionEvent)
if (!hitResultList.isEmpty()) {
for (hit in hitResultList) {
val trackable = hit.trackable
// Assuming your mesh is associated with an Anchor
if (trackable is Anchor && trackable == yourMeshAnchor) {
Log.d(TAG, "Mesh tapped!")
}
// If you are looking for hits on specific types of trackables, like Planes
if (trackable is Plane) {
Log.d(TAG, "Plane tapped!")
// Further checks can be done here to see if this Plane is related to your mesh
}
// If you have other conditions or objects to check, do so here
}
}
motionEvent = null
}
这里,
yourMeshAnchor
应该是您将Anchor
放置在AR场景中时使用的Mesh
。
这里,
yourMeshAnchor
应该是您将Anchor
放置在AR场景中时使用的Mesh
。
因此,确定命中测试是否与您的特定
Mesh
相交的确切方法取决于您的 Mesh
如何集成到 AR 场景中,以及您正在使用的 AR 平台的功能。如果您的 Mesh
是 ARCore 中不直接支持作为 Trackable
类型的自定义对象,您可能需要实现额外的逻辑来在 Trackable
对象和自定义对象之间进行映射。