Google ARCore Cloud Anchors находятся не в правильном положении - PullRequest
0 голосов
/ 24 апреля 2020

Так что я впервые работаю с AR и ARCore. Я создал приложение для обслуживания воображаемой машины (это школьный проект).

Я создал инструмент для рисования горизонтальных линий в приложении. Эти строки затем должны быть переданы всем пользователям через облачные якоря. Совместное использование работает отлично, и линии сначала отображаются правильно на экране другого устройства. Но затем, через несколько секунд, положение линий полностью меняется, и каждая фигура, которую делает пользователь, разрушается.

Я действительно не понимаю. Пока фигура не отцентрирована на экране, они находятся в правильном положении.

Я сделал несколько снимков экрана, чтобы показать, что я имею в виду:

Сначала пользователь dr aws фигура , Линии зеленого цвета, если они не привязаны к облаку

Тогда с другого устройства после загрузки форма будет отображаться правильно, если пользователь до сих пор смотрит на нее непосредственно (фигура в середине экрана)

Как только я центрирую камеру на фигуре, все линии переместятся и окажутся совершенно в неправильном положении

Эта функция dr aws форма. Вектор местоположения от начальной и конечной точек сохраняется в списке под названием «cloudAnchorDes c». Этот список затем загружается в FireBase, когда пользователь нажимает кнопку загрузки.

private fun drawHorizontalLine(hitResult: HitResult) {

    val scene = arFragment.arSceneView.scene

    if (!line1Created){

        lineAnchor1 = hitResult.createAnchor()
        lineAnchorNode1 = AnchorNode(lineAnchor1)
        line1Created = true

        MaterialFactory.makeOpaqueWithColor(this, com.google.ar.sceneform.rendering.Color(Color.RED))
            .thenAccept{

                val pointRenderable = ShapeFactory.makeSphere(0.02f, Vector3.zero(), it)

                lineAnchorNode1.renderable = pointRenderable
                scene.addChild(lineAnchorNode1)
            }

    }else{

        lineAnchor2 = hitResult.createAnchor()
        val lineAnchorNode2 = AnchorNode(lineAnchor2)

        val ortsVektor1 = lineAnchorNode1.worldPosition
        val ortsVektor2 = lineAnchorNode2.worldPosition
        val v1 = Vector3.subtract(lineAnchorNode1.worldPosition, Vector3.zero())
        val v2 = Vector3.subtract(lineAnchorNode2.worldPosition, Vector3.zero())
        val lineVector = Vector3.subtract(ortsVektor1,ortsVektor2)
        val vectorMidpoint = Vector3.add(ortsVektor1, ortsVektor2).scaled(0.5f) // (Vektor1+Vektor2)/2 = Ortsvektor dazwischen
        val lineNormalized = lineVector.normalized()
        val rotation = Quaternion.lookRotation(lineNormalized, Vector3.up())
        val line = TransformableNode(arFragment.transformationSystem)

        MaterialFactory.makeOpaqueWithColor(this, com.google.ar.sceneform.rendering.Color(Color.GREEN))
            .thenAccept{

                val lineRenderable = ShapeFactory.makeCube(Vector3(0.02f,0.02f,lineVector.length()), Vector3.zero(), it)
                val nodeLine = AnchorNode()

                line.setParent(lineAnchorNode2)
                line.translationController
                line.renderable = lineRenderable
                line.worldPosition = Vector3(vectorMidpoint.x, vectorMidpoint.y + 0.1f, vectorMidpoint.z)
                line.worldRotation = rotation

                scene.removeChild(lineAnchorNode1)
                scene.addChild(lineAnchorNode2)
                line.select()

                anchorList.add(lineAnchor2)
                cloudAnchorDesc.add(ARType("line", Vector(v1.x, v1.y, v1.z), Vector(v2.x, v2.y, v2.z)))

                line1Created = false
            }
    }

}

Эта функция dr aws форма из якоря облака (startVector и endVector хранятся в базе данных Firebase)

private fun drawLineFromCloud(anchor: Anchor?, startVector: Vector3, endVector: Vector3) {


    val lineAnchorNode = AnchorNode(anchor)

    val scene = arFragment.arSceneView.scene

    val lineVector = Vector3.subtract(startVector, endVector)
    val lineNormalized = lineVector.normalized()
    val vectorMidpoint = Vector3.add(startVector, endVector).scaled(0.5f) // (Vektor1+Vektor2)/2 = Ortsvektor dazwischen
    val rotation = Quaternion.lookRotation(lineNormalized, Vector3.up())
    val line = Node()


    MaterialFactory.makeOpaqueWithColor(this, com.google.ar.sceneform.rendering.Color(Color.BLUE))
        .thenAccept {

            val lineRenderable = ShapeFactory.makeCube(Vector3(0.02f, 0.02f, lineVector.length()), Vector3.zero(), it)

            line.renderable = lineRenderable
            line.localRotation = rotation
            line.localPosition = Vector3(vectorMidpoint.x, vectorMidpoint.y + 0.1f, vectorMidpoint.z)
            line.setParent(lineAnchorNode)
            scene.addChild(lineAnchorNode)

        }

}

Я очень благодарен за вашу помощь.

...