Размещение статического объекта в углу экрана с помощью ArCore

Я создаю приложение для навигации с дополненной реальностью и не очень хорошо знаком с его аспектом. Можно ли разместить объект в статическом положении, например, в углу экрана?

Я основал свое приложение на примере формы сцены из Google: https://github.com/google-ar/sceneform-android-sdk/tree/master/samples/hellosceneform. Я уже импортировал 3D-модель, которую хочу использовать. В настоящее время приложение ищет якоря, на которых можно разместить объект. Я просто хочу разместить стрелку навигации в углу экрана, хотя стрелка все равно должна вращаться.

Я уже искал примеры или похожие вопросы, но не нашел. Спасибо за помощь.


person user3742929    schedule 29.11.2019    source источник
comment
не могли бы вы помочь мне, я застрял на этом. Было бы очень полезно, если бы вы могли предоставить образец того, как вы использовали якорную матрицу.   -  person Renjith K N    schedule 27.07.2020
comment
Привет, Ренджит. У меня все еще есть исходный код, я изучу его и выложу здесь.   -  person user3742929    schedule 29.07.2020
comment
Я добавил его ниже, дайте мне знать, если вам понадобится дополнительная информация.   -  person user3742929    schedule 29.07.2020
comment
Спасибо Спасибо. Это очень помогает, позвольте мне попробовать реализовать его.   -  person Renjith K N    schedule 29.07.2020


Ответы (2)


Сделайте 3D-модель дочерним элементом узла камеры, сделав его дочерним по отношению к узлу камеры, и вы заставляете ее обновлять положение относительно камеры, а не привязки. Используйте местное вращение, чтобы повернуть модель.

[Обновить]

Вы также можете использовать сцену как часть layout.xml приложения. В layout.xml для представления добавьте SceneView как часть макета представления.

<com.google.ar.sceneform.SceneView
        android:id="@+id/sceneView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
/>

затем в вашем MainActivity.java

import android.net.Uri
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.Toast
import com.google.ar.sceneform.Node
import com.google.ar.sceneform.Scene
import com.google.ar.sceneform.math.Vector3
import com.google.ar.sceneform.rendering.ModelRenderable
import kotlinx.android.synthetic.main.act_main.*

class MainActivity : AppCompatActivity() {

    private lateinit var scene: Scene
    private lateinit var node: Node

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.act_main)

        scene = sceneView.scene
        render(Uri.parse("coffee_cup.sfb"))
    }

    private fun render(uri: Uri) {
        ModelRenderable.builder()
            .setSource(this, uri)
            .build()
            .thenAccept {
                addNode(it)
            }
            .exceptionally {
                Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show()
                return@exceptionally null
            }

    }

    private fun addNode(model: ModelRenderable?) {
        model?.let {
            node = Node().apply {
                setParent(scene)
                localPosition = Vector3(0f, -2f, -7f)
                localScale = Vector3(3f, 3f, 3f)
                renderable = it
            }

            scene.addChild(node)
        }
    }

    override fun onPause() {
        super.onPause()
        sceneView.pause()
    }

    override fun onResume() {
        super.onResume()
        sceneView.resume()
    }
}
person Hermes    schedule 01.12.2019
comment
Это сработало, спасибо. Я использовал camera.getPose().toMatrix(cameraAnchorMatrix, 0);, чтобы получить матрицу привязки. - person user3742929; 10.12.2019
comment
@ user3742929 Я обновил свой ответ, включив в него пример того, как включить пример использования формы сцены как части экрана. - person Hermes; 10.12.2019
comment
Спасибо, я тоже займусь этим. - person user3742929; 11.12.2019

if (useStaticArrow) {
            // Rotation at the registerListeners is measured, so that the arrow points to north in our coordinate system

            camera.getPose().compose(Pose.makeTranslation(0.37f, -0.17f, -1f))
                    .extractTranslation().toMatrix(cameraAnchorMatrix, 0);

            // Rotate the arrow in the needed direction to the next target
            Matrix.rotateM(cameraAnchorMatrix, 0, neededStartRotation + directionChange, 0f, 1f, 0f);

            virtualObject.updateModelMatrix(cameraAnchorMatrix, scaleFactor / 12f);
            virtualObject.draw(viewmtx, projmtx, colorCorrectionRgba, arrowColor);
} 

(Полный фрагмент кода для Renjith)

person user3742929    schedule 29.07.2020