Не уверен, как выразить это словами.Мое приложение дает сбой, когда предполагается поместить элемент на плоскость, а затем после этого ответа нет - PullRequest
0 голосов
/ 09 апреля 2019

Ссылка на приложение на google drive У меня есть это приложение на gitHub, но оно не совсем то, что и на этом, поэтому я загрузил эту версию на google drive вместо gitHub

снимок экрана снимок экрана также содержит краткое изложение проблемы

Новичок здесь, это может быть простое решение, но я просто не нашел его.

У меня есть менюс картинками / иконками мебели внизу экрана.Я хочу, чтобы, когда вы нажимаете на одну из картинок и нажимаете на якорь (место, где я могу поместить объект / актив), объект должен быть помещен на якорь, где вы нажимаете

Я попытался войтипосле отладки привязки к консоли отладки, просто чтобы увидеть, распознает ли приложение, какой актив / объект был задействован.

Так что, если я, например, постучал по стулу, а затем нажал на якорь, приложение сможет распознать, что я постучал по стулу.

У меня установлен плагин sceneform У меня есть форма сцены вмои зависимости gradle

Извините за весь этот код, просто не знаю, где именно проблема.

Я предполагаю, что она возникает только при размещении объекта, и я хотел добавить его для всех, ктовозможно, потребуется увидеть недостающие детали

//My imports

package com.google.ar.sceneform.overlei;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.google.ar.core.Anchor;
import com.google.ar.core.HitResult;
import com.google.ar.core.Plane;
import com.google.ar.sceneform.AnchorNode;
import com.google.ar.sceneform.rendering.ModelRenderable;
import com.google.ar.sceneform.rendering.Renderable;
import com.google.ar.sceneform.samples.Overlei.R;
import com.google.ar.sceneform.ux.ArFragment;
import com.google.ar.sceneform.ux.TransformableNode;

//At this point i have installed the google sceneform plugin. This is 
//whats going to help be able to work with 3D assets


public class Overlei extends AppCompatActivity {

private ArFragment fragment;
private Uri currentltySelectedObject;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//brings up hand and camera to scan environment
setContentView(R.layout.activity_ux);

fragment = (ArFragment) 
getSupportFragmentManager().findFragmentById(R.id.sceneform_fragment);

initializeGallary();


fragment.setOnTapArPlaneListener((HitResult hitResult, Plane plane, 
MotionEvent motionEvent) -> {


          //checking if the scene being detected is horizontal

          if (plane.getType() != Plane.Type.HORIZONTAL_UPWARD_FACING) {
            return;
          }

          //creating anchor
          Anchor anchor = hitResult.createAnchor();
          placeObject(fragment, anchor, currentltySelectedObject);

        }
);

}

//show the menu at the bottom (this works)

public void initializeGallary() {

LinearLayout gallary = findViewById(R.id.gallery_layout);

//create chair thumbnails/picturee
ImageView chair = new ImageView(this);
chair.setImageResource(R.drawable.chair_thumb);
chair.setContentDescription("chair asset");

//parsing the file, gives reference to object
chair.setOnClickListener(view -> currentltySelectedObject = 
Uri.parse("chair.sfb"));
gallary.addView(chair);

//create couch picture/icon
//where im getting the image from
ImageView couch = new ImageView(this);
//imageView resource
couch.setImageResource(R.drawable.couch_thumb);
//attaching a description
couch.setContentDescription("couch asset");
//setting onclick action to set the currentlySelectedObject
couch.setOnClickListener(view -> currentltySelectedObject = 
Uri.parse("couch.sfb"));
gallary.addView(couch);

//lampPost picture/icon
ImageView lampPost = new ImageView(this);
lampPost.setImageResource(R.drawable.lamp_thumb);
lampPost.setContentDescription("lampPost asset");
lampPost.setOnClickListener(view -> currentltySelectedObject = 
Uri.parse("lampPost.sfb"));
gallary.addView(lampPost);
}

//anchor is where im going to place the object takes into
//this method also has 'build' call method called addNodeToScene, find 
//this method below

private void placeObject(ArFragment arFragment, Anchor anchor, Uri model) {
ModelRenderable.builder().setSource(arFragment.getContext(), 
model).build()

        .thenAccept(renderable -> addNodeToScene(arFragment, anchor, 
renderable)).exceptionally((throwable -> {
  AlertDialog.Builder builder = new AlertDialog.Builder(this);
  builder.setMessage(throwable.getMessage()).setTitle("Error");

  AlertDialog dialog = builder.create();
  dialog.show();
  return null;
}));
}


private void addNodeToScene(ArFragment arFragment, Anchor anchor, 
Renderable renderable) {
//create an anchor node
AnchorNode anchorNode = new AnchorNode(anchor);
//create transformable node
TransformableNode transformableNode = new 
TransformableNode(arFragment.getTransformationSystem());
transformableNode.setRenderable(renderable);

//make anchorNode parent of transformable
transformableNode.setParent(anchorNode);
//add node for interactiion
arFragment.getArSceneView().getScene().addChild(anchorNode);

transformableNode.select();
  }

}


//============================XML CODE==============================
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.google.ar.sceneform.overlei.Overlei">

<fragment
    android:id="@+id/sceneform_fragment"
    android:name="com.google.ar.sceneform.ux.ArFragment"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@+id/gallery_layout"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_chainStyle="spread"
    app:layout_constraintVertical_weight="9" />

<LinearLayout
    android:id="@+id/gallery_layout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:gravity="center_horizontal"
    android:orientation="horizontal"

    android:visibility="visible"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/sceneform_fragment"
    app:layout_constraintVertical_chainStyle="spread"
    app:layout_constraintVertical_weight="1" />

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

1 Ответ

0 голосов
/ 18 апреля 2019

Так что после некоторого тестирования на разных устройствах мне удалось вывести сообщение об ошибке на одном из них, в котором говорилось, что «Нет такого файла».Поэтому я решил, что это должны быть пути, определенные для файлов.После исправления мне удалось заставить его работать

...