如何检测 HitTest 是否击中给定的 Mesh 对象?

问题描述 投票:0回答:1

我正在遵循 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
    }
android geospatial arcore
1个回答
0
投票

从我在文档中看到的内容(“ARCore / 在 Android 应用程序中执行命中测试”),检测

HitTest
结果是否命中 ARCore 或类似 AR 中给定的
Mesh
对象
平台上,您需要将从命中结果中获得的
Trackable
Mesh
的实例或您感兴趣的对象进行比较。

但是,使用 HitResult

 直接比较 
Mesh
 对象
与您的
equals
并不是正确的方法,因为
HitResult
和您的
Mesh
对象是不同类型的对象。
请参阅 François Dupire 的“比较 Java 中的对象”,并由 Greg Martin

审阅

相反,您应该检查与每个 Trackable 关联的

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
对象和自定义对象之间进行映射。

© www.soinside.com 2019 - 2024. All rights reserved.