Добавление объекта в вертикальной плоскости всегда вращается в ядре AR
Я добавляю изображение на вертикальную плоскость в AR-фрагменте сцены. Но это всегда вращается. Код работает нормально на горизонтальной плоскости. Мой код для размещения изображений на вертикальной плоскости следующий.
arFragment.setOnTapArPlaneListener { hitResult: HitResult, plane: Plane, motionEvent: MotionEvent ->
if (!isOnceTapedOnSurface) {
val anchor = hitResult.createAnchor()
val anchorNode = AnchorNode(anchor)
anchorNode.setParent(arFragment.arSceneView.scene)
andy = TransformableNode(arFragment.transformationSystem)
if(plane.type == Plane.Type.VERTICAL){
val anchorUp = anchorNode.up
andy.setLookDirection(Vector3.up() , anchorUp)
}
andy.setParent(anchorNode)
andy.renderable = andyRenderable
andy.select()
// arFragment.arSceneView.planeRenderer.isVisible = false
isOnceTapedOnSurface = true
}
}
2 ответа
Чтобы решить эту проблему, вы можете использовать вышеуказанное решение. Но вы должны вращать объект, используя вращение мира. Не используйте местное вращение. Нам нужно обнулить значение вращения. Если вы используете локальное вращение, объект будет вести себя как якорное (родительское) вращение. Итак, используя вращение мира, мы можем управлять объектом.
String planeType = "";
// При нажатии на поверхность можно получить ориентацию якоря
if (plane.getType() == Plane.Type.VERTICAL){
planeType = "Vertical";
}else if (plane.getType() == Plane.Type.HORIZONTAL_UPWARD_FACING){
planeType = "Horizontal_Upward";
}else if (plane.getType() == Plane.Type.HORIZONTAL_DOWNWARD_FACING){
planeType = "Horizontal_Downward";
}else {
planeType = "Horizontal";
}```
// First set object world rotation zero
transformableNode.setWorldRotation(Quaternion.axisAngle(new Vector3(0, 0f, 0), 0));
// check plane type is vertical or horizontal if it is vertical below logic will work.
if (planeType.equals("Vertical")) {
Vector3 anchorUp = anchorNode.getUp();
transformableNode.setLookDirection(Vector3.up(), anchorUp);
}
Чтобы решить эту проблему, вам нужно установить
public Pose getCenterPose()
, Возвращает позу центра обнаруженной плоскости, определенной для начала координат. Поза трансформируется+Y
ось будет точкой нормали из плоскости, с+X
а также+Z
Оси, ориентирующие экстенты ограничивающего прямоугольника.
anchor = mySession.createAnchor(plane.getCenterPose())
Когда его отслеживаемое состояние TRACKING
эта поза синхронизируется с последним кадром. Когда его отслеживаемое состояние PAUSED
, личная поза будет возвращена.
Ваш код может быть следующим:
Anchor newAnchor;
for (Plane plane : mSession.getAllTrackables(Plane.class)) {
if(plane.getType() == Plane.Type.VERTICAL &&
plane.getTrackingState() == TrackingState.TRACKING) {
newAnchor = plane.createAnchor(plane.getCenterPose());
break;
}
}
Еще одна вещь от разработчиков программного обеспечения Google ARCore:
Keep objects close to anchors
,При закреплении объектов убедитесь, что они находятся рядом с используемым якорем. Старайтесь не размещать объекты дальше нескольких метров от якоря, чтобы предотвратить неожиданное вращательное движение из-за обновлений ARCore в мировых космических координатах.
Если вам нужно разместить объект на расстоянии более нескольких метров от существующей привязки, создайте новую привязку ближе к этой позиции и прикрепите объект к новой привязке.
Надеюсь это поможет.