Menjalankan hit-test di aplikasi Android
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Lakukan hit-test untuk menentukan penempatan objek 3D yang benar di pemandangan Anda. Penempatan yang benar memastikan konten AR dirender pada ukuran yang sesuai (jelas).
Jenis hasil hit
Hit-test dapat menghasilkan empat jenis hasil hit yang berbeda, seperti yang ditunjukkan oleh tabel berikut.
Jenis hasil hit |
Deskripsi |
Orientasi |
Kasus penggunaan |
Panggilan metode |
Tebal (DepthPoint ) |
Menggunakan informasi kedalaman dari seluruh adegan untuk menentukan kedalaman dan orientasi titik yang benar
|
Tegak lurus terhadap permukaan 3D
|
Meletakkan objek virtual di atas permukaan sembarang tempat (tidak hanya di lantai dan dinding)
|
ArDepthMode harus diaktifkan agar dapat berfungsi.
Frame.hitTest(…) , periksa DepthPoint dalam daftar pengembalian
|
Plane |
Menabrak permukaan horizontal dan/atau vertikal untuk menentukan kedalaman dan orientasi titik yang benar
|
Tegak lurus dengan permukaan 3D
|
Tempatkan objek di bidang (lantai atau dinding) menggunakan geometri penuh bidang. Perlu timbangan yang benar segera. Penggantian untuk hit-test Depth
|
Frame.hitTest(…) , periksa Plane dalam daftar pengembalian
|
Poin fitur (Point ) |
Mengandalkan fitur visual di sekitar titik yang diketuk pengguna untuk menentukan posisi dan orientasi titik yang benar
|
Tegak lurus dengan permukaan 3D
|
Meletakkan objek di permukaan sembarang tempat (tidak hanya di lantai dan dinding)
|
Frame.hitTest(…) , periksa Point dalam daftar pengembalian
|
Penempatan Instan (InstantPlacementPoint ) |
Menggunakan ruang layar untuk menempatkan konten. Awalnya menggunakan perkiraan kedalaman yang disediakan oleh aplikasi. Dapat langsung berfungsi, tetapi pose dan kedalaman sebenarnya akan berubah setelah ARCore dapat menentukan geometri adegan yang sebenarnya
|
+Y menunjuk ke atas, berlawanan dengan gravitasi
|
Letakkan objek di bidang (lantai atau dinding) menggunakan geometri penuh bidang yang memerlukan penempatan cepat, dan pengalamannya dapat menoleransi kedalaman dan skala awal yang tidak diketahui
|
Frame.hitTestInstantPlacement(float, float, float)
|
Panggil Frame.hitTest()
untuk melakukan hit-test, menggunakan utilitas TapHelper
untuk mendapatkan MotionEvent
dari tampilan AR.
Java
MotionEvent tap = tapHelper.poll();
if (tap == null) {
return;
}
if (usingInstantPlacement) {
// When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
// how far away the anchor will be placed, relative to the camera's view.
List<HitResult> hitResultList =
frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
// Hit-test results using Instant Placement will only have one result of type
// InstantPlacementResult.
} else {
List<HitResult> hitResultList = frame.hitTest(tap);
// TODO: Filter hitResultList to find a hit result of interest.
}
Kotlin
val tap = tapHelper.poll() ?: return
val hitResultList =
if (usingInstantPlacement) {
// When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
// how far away the anchor will be placed, relative to the camera's view.
frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
// Hit-test results using Instant Placement will only have one result of type
// InstantPlacementResult.
} else {
frame.hitTest(tap)
}
Filter hasil hit berdasarkan jenis yang Anda minati. Misalnya, jika Anda ingin berfokus pada DepthPoint
:
Java
// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's
// origin.
// The first hit result is often the most relevant when responding to user input.
for (HitResult hit : hitResultList) {
Trackable trackable = hit.getTrackable();
if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
// Do something with this hit result. For example, create an anchor at this point of
// interest.
Anchor anchor = hit.createAnchor();
// TODO: Use this anchor in your AR experience.
break;
}
}
Kotlin
// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's
// origin.
// The first hit result is often the most relevant when responding to user input.
val firstHitResult =
hitResultList.firstOrNull { hit ->
when (val trackable = hit.trackable!!) {
is DepthPoint -> true // Replace with any type of trackable type
else -> false
}
}
if (firstHitResult != null) {
// Do something with this hit result. For example, create an anchor at this point of interest.
val anchor = firstHitResult.createAnchor()
// TODO: Use this anchor in your AR experience.
}
Melakukan hit-test menggunakan sinar dan arah arbitrer
Hit-test biasanya diperlakukan sebagai sinar dari perangkat atau kamera perangkat, tetapi Anda dapat menggunakan Frame.hitTest(float[], int, float[], int)
untuk melakukan hit-test menggunakan sinar arbitrer dalam koordinat ruang dunia, bukan titik ruang layar.
Membuat Anchor menggunakan hasil hit
Setelah mendapatkan hasil hit, Anda dapat menggunakan posenya sebagai input untuk menempatkan konten AR dalam scene. Gunakan HitResult.createAnchor()
untuk membuat Anchor
baru, yang memastikan bahwa konten dilampirkan ke Trackable
yang mendasari hasil hit. Misalnya, anchor akan tetap melekat pada bidang yang terdeteksi untuk hasil hit Pesawat, sehingga tampak seperti bagian dari dunia nyata.
Langkah selanjutnya
Kecuali dinyatakan lain, konten di halaman ini dilisensikan berdasarkan Lisensi Creative Commons Attribution 4.0, sedangkan contoh kode dilisensikan berdasarkan Lisensi Apache 2.0. Untuk mengetahui informasi selengkapnya, lihat Kebijakan Situs Google Developers. Java adalah merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-07-26 UTC.
[null,null,["Terakhir diperbarui pada 2025-07-26 UTC."],[[["\u003cp\u003eHit-tests determine correct placement of 3D objects in AR scenes by identifying real-world surfaces and their positions.\u003c/p\u003e\n"],["\u003cp\u003eThere are four types of hit-test results: Depth, Plane, Feature Point, and Instant Placement, each with its own characteristics and use cases.\u003c/p\u003e\n"],["\u003cp\u003eDevelopers can filter hit-test results to focus on specific surface types like planes or depth points for precise object placement.\u003c/p\u003e\n"],["\u003cp\u003e\u003ccode\u003eHitResult.createAnchor()\u003c/code\u003e enables the creation of anchors at the identified hit points, allowing virtual content to be attached to real-world surfaces.\u003c/p\u003e\n"],["\u003cp\u003eStandard and arbitrary ray hit-tests are available, offering flexibility in how virtual objects are positioned within the AR environment.\u003c/p\u003e\n"]]],["A hit-test determines the correct placement of 3D objects in AR scenes. It involves calling `Frame.hitTest()` or `Frame.hitTestInstantPlacement()` with screen coordinates or a custom ray. Hit results include `DepthPoint`, `Plane`, `Point`, and `InstantPlacementPoint`, each suited for different surfaces and scenarios. Results are filtered based on the desired type and are used to create `Anchor`s with `HitResult.createAnchor()`, allowing content to attach to `Trackable` objects and appear in the real world.\n"],null,["# Perform hit-tests in your Android app\n\nPerform a [hit-test](/ar/develop/hit-test) to determine the correct placement of a 3D object in your scene. Correct placement ensures that the AR content is rendered at the appropriate (apparent) size.\n\nHit result types\n----------------\n\nA hit-test can yield four different types of hit results, as shown by the following table.\n\n| Hit result type | Description | Orientation | Use case | Method calls |\n|------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Depth ([`DepthPoint`](/ar/reference/java/com/google/ar/core/DepthPoint)) | Uses depth information from the entire scene to determine a point's correct depth and orientation | Perpendicular to the 3D surface | Place a virtual object on an arbitrary surface (not just on floors and walls) | **[`ArDepthMode`](/ar/reference/c/group/ar-config#ardepthmode) must be enabled for this to work.** [`Frame.hitTest(...)`](/ar/reference/java/com/google/ar/core/Frame#hitTest-motionEvent), check for [`DepthPoint`](/ar/reference/java/com/google/ar/core/DepthPoint)s in the return list |\n| [`Plane`](/ar/reference/java/com/google/ar/core/Plane) | Hits horizontal and/or vertical surfaces to determine a point's correct depth and orientation | Perpendicular to the 3D surface | Place an object on a plane (floor or wall) using the plane's full geometry. Need correct scale immediately. Fallback for the Depth hit-test | [`Frame.hitTest(...)`](/ar/reference/java/com/google/ar/core/Frame#hitTest-motionEvent), check for [`Plane`](/ar/reference/java/com/google/ar/core/Plane)s in the return list |\n| Feature point ([`Point`](/ar/reference/java/com/google/ar/core/Point)) | Relies on visual features around the point of a user tap to determine a point's correct position and orientation | Perpendicular to the 3D surface | Place an object on an arbitrary surface (not just on floors and walls) | [`Frame.hitTest(...)`](/ar/reference/java/com/google/ar/core/Frame#hitTest-motionEvent), check for [`Point`](/ar/reference/java/com/google/ar/core/Point)s in the return list |\n| Instant Placement ([`InstantPlacementPoint`](/ar/reference/java/com/google/ar/core/InstantPlacementPoint)) | Uses screen space to place content. Initially uses estimated depth provided by the app. Works instantly, but pose and actual depth will change once ARCore is able to determine actual scene geometry | +Y pointing up, opposite to gravity | Place an object on a plane (floor or wall) using the plane's full geometry where fast placement is critical, and the experience can tolerate unknown initial depth and scale | [`Frame.hitTestInstantPlacement(float, float, float)`](/ar/reference/java/com/google/ar/core/Frame#hitTestInstantPlacement-xPx-yPx-approximateDistanceMeters) |\n\nPerform a standard hit-test\n---------------------------\n\nCall [`Frame.hitTest()`](/ar/reference/java/com/google/ar/core/Frame#hitTest-motionEvent) to perform a hit-test, using the [`TapHelper`](https://github.com/google-ar/arcore-android-sdk/blob/c684bbda37e44099c273c3e5274fae6fccee293c/samples/hello_ar_java/app/src/main/java/com/google/ar/core/examples/java/common/helpers/TapHelper.java) utility to obtain [`MotionEvent`](https://developer.android.com/reference/android/view/MotionEvent)s from the AR view. \n\n### Java\n\n```java\nMotionEvent tap = tapHelper.poll();\nif (tap == null) {\n return;\n}\n\nif (usingInstantPlacement) {\n // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine\n // how far away the anchor will be placed, relative to the camera's view.\n List\u003cHitResult\u003e hitResultList =\n frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);\n // Hit-test results using Instant Placement will only have one result of type\n // InstantPlacementResult.\n} else {\n List\u003cHitResult\u003e hitResultList = frame.hitTest(tap);\n // TODO: Filter hitResultList to find a hit result of interest.\n}\n```\n\n### Kotlin\n\n```kotlin\nval tap = tapHelper.poll() ?: return\nval hitResultList =\n if (usingInstantPlacement) {\n // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine\n // how far away the anchor will be placed, relative to the camera's view.\n frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)\n // Hit-test results using Instant Placement will only have one result of type\n // InstantPlacementResult.\n } else {\n frame.hitTest(tap)\n }\n```\n\nFilter hit results based on the type you're interested in. For example, if you'd like to focus on `DepthPoint`s: \n\n### Java\n\n```java\n// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's\n// origin.\n// The first hit result is often the most relevant when responding to user input.\nfor (HitResult hit : hitResultList) {\n Trackable trackable = hit.getTrackable();\n if (trackable instanceof DepthPoint) { // Replace with any type of trackable type\n // Do something with this hit result. For example, create an anchor at this point of\n // interest.\n Anchor anchor = hit.createAnchor();\n // TODO: Use this anchor in your AR experience.\n break;\n }\n}\n```\n\n### Kotlin\n\n```kotlin\n// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's\n// origin.\n// The first hit result is often the most relevant when responding to user input.\nval firstHitResult =\n hitResultList.firstOrNull { hit -\u003e\n when (val trackable = hit.trackable!!) {\n is DepthPoint -\u003e true // Replace with any type of trackable type\n else -\u003e false\n }\n }\nif (firstHitResult != null) {\n // Do something with this hit result. For example, create an anchor at this point of interest.\n val anchor = firstHitResult.createAnchor()\n // TODO: Use this anchor in your AR experience.\n}\n```\n\nConduct a hit-test using an arbitrary ray and direction\n-------------------------------------------------------\n\nHit-tests are typically treated as rays from the device or device camera, but you can use [`Frame.hitTest(float[], int, float[], int)`](/ar/reference/java/com/google/ar/core/Frame#hitTest-origin3-originOffset-direction3-directionOffset) to conduct a hit-test using an arbitrary ray in world space coordinates instead of a screen-space point.\n\nCreate an Anchor using the hit result\n-------------------------------------\n\nOnce you have a hit result, you can use its pose as input to [place AR content](/ar/develop/anchors) in your scene. Use [`HitResult.createAnchor()`](/ar/reference/java/com/google/ar/core/HitResult) to create a new [`Anchor`](/ar/develop/anchors), ensuring that the content attaches to the underlying [`Trackable`](/ar/reference/java/com/google/ar/core/Trackable) of the hit result. For example, the anchor will remain attached to the detected plane for a Plane hit result, thus appearing to be part of the real world.\n\nWhat's next\n-----------\n\n- Check out the [`hello_ar_java`](https://github.com/google-ar/arcore-android-sdk/tree/master/samples/hello_ar_java) and [`hello_ar_kotlin`](https://github.com/google-ar/arcore-android-sdk/tree/master/samples/hello_ar_kotlin) sample apps on GitHub."]]