Так что я впервые работаю с 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)
}
}
Я очень благодарен за вашу помощь.