Мы разрабатываем приложение AR Android, которое развертывает модель на прессованной плоскости. Мы пробовали использовать шаблон MVC, это наш код. Стадия проектирования была довольно сложной, и мы новички, поэтому я буду признателен за ваш совет.
Наша модель
public class ARModels {
//properties
private StorageReference modelRef;
private Context context;
//constructors
public ARModels( String name , Context context){
this.context = context;
FirebaseApp.initializeApp(context);
FirebaseStorage storage = FirebaseStorage.getInstance();
name = name.toLowerCase();
modelRef = storage.getReference().child(name + ".glb");
getModel(name);
}
//methods
private void getModel(String s){
try {
File file = File.createTempFile( s , "glb");
modelRef.getFile(file).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
buildModel(file);
}
});
} catch (IOException e){
e.printStackTrace();
}
}
public ModelRenderable renderable;
private void buildModel(File file) {
RenderableSource renderableSource = RenderableSource
.builder()
.setSource(context, Uri.parse(file.getPath()), RenderableSource.SourceType.GLB)
.setRecenterMode(RenderableSource.RecenterMode.ROOT)
.build();
ModelRenderable
.builder()
.setSource( context, renderableSource)
.setRegistryId(file.getPath())
.build()
.thenAccept(modelRenderable -> {
renderable = modelRenderable;
});
}
Наш класс представления
public class ARScreen extends AppCompatActivity {
//properties
private ArFragment arFragment;
private ARScreenController controller;
private String s;
private ARModels models;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a_r_screen);
s = getIntent().getExtras().getString("ModelName");
models = new ARModels(s, this);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById( R.id.arFragment);
controller = new ARScreenController( arFragment, this, s);
assert arFragment != null;
arFragment.setOnTapArPlaneListener((hitResult, plane, motionEvent) -> {
AnchorNode anchor = new AnchorNode(hitResult.createAnchor());
anchor.setRenderable(models.renderable);
controller.InsertModel(s, arFragment, anchor);
});
}
}
Наш контроллер
public class ARScreenController {
//properties
private ArFragment arFragment;
private Context context;
private ARModels models;
//constructors
public ARScreenController(ArFragment fragment, Context context, String s){
arFragment = fragment;
this.context = context;
models = new ARModels(s, this.context);
}
//methods
public void InsertModel(String s, ArFragment arFragment, AnchorNode node){
/*
arFragment = (ArFragment) ((AppCompatActivity)context).getSupportFragmentManager().findFragmentById( R.id.arFragment);
assert arFragment != null;
arFragment.setOnTapArPlaneListener((hitResult, plane, motionEvent) -> {
AnchorNode anchor = new AnchorNode(hitResult.createAnchor());
*/
//models.getModel(s);
ModelRenderable
.builder()
.build()
.thenAccept(modelRenderable -> {
node.setRenderable(models.renderable);
arFragment.getArSceneView().getScene().addChild(node);
});
}
}
То, что я сделал здесь, это то, что я получил текст кнопки, нажатой на предыдущем действии в моем классе View, который для тестовых целей это текст «мозг». У меня есть файл brain.glb в моем хранилище firebase, а остальное - для загрузки модели из firebase в нашу модель и развертывания ее во фрагменте в нашем классе контроллера. Что происходит в моем случае: я открываю экран AR, я нашел самолет, но ничего не происходит, когда я нажимаю на него. Я не уверен, что для этого тоже есть ошибка c (?), В logcat написано
Невозможно загрузить Renderable registryId = 'null' java .lang.AssertionError: ModelRenderable должен иметь исходный код.
Пожалуйста, помогите мне, и извините за испорченный код, я знаю, что это довольно сложно и плохо написано. Я был бы рад, если бы у вас был совет.