[英].obj/.gltf 3D model won't show in ARCore
我按照在線教程創建了一個可以在 AR 中顯示我的 3D 模型的 AR 應用程序。
我將我的 .obj 和 .gltf 3d 模型文件放在我的資產文件夾中,
當我點擊飛機時,方法 placeObject() 應該運行並將我的模型 (selectObject) 放在這個地方。
但是當我在手機上測試它時,在檢測到飛機並點擊屏幕后,沒有任何反應,我檢查了我的 logcat 並在我點擊時顯示錯誤:
2021-11-04 01:55:46.629 11172-12363/com.example.arcoretest E/ModelRenderable: Unable to load Renderable registryId='testscene.obj'
java.util.concurrent.CompletionException: java.lang.AssertionError: No RCB file at uri: testscene.obj
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:278)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:284)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1629)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:920)
Caused by: java.lang.AssertionError: No RCB file at uri: testscene.obj
at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.byteBufferToSfb(LoadRenderableFromSfbTask.java:191)
at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0$com-google-ar-sceneform-rendering-LoadRenderableFromSfbTask(LoadRenderableFromSfbTask.java:121)
我不確定問題出在哪里,是我的 uri 錯誤還是我應該使用其他 3d 模型格式? (我嘗試了 .obj/.fbx/.gltf 但它們都不起作用)(我不能使用 .sfb 或 .sfa ,我不能再使用sceneform插件將文件轉換為sfa/sfb,因為它已被棄用)
這是我的成績依賴項:
{
實現 'com.google.ar.sceneform.ux:sceneform-ux:1.15.0'
實現 'com.google.ar:core:1.15.0'
實現 'com.google.ar.sceneform:assets:1.15.0' ... }
我的 mainActivity.java:
package com.example.arcoretest;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
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.ux.ArFragment;
import com.google.ar.sceneform.ux.TransformableNode;
public class MainActivity extends AppCompatActivity {
private ArFragment fragment;
private Uri selectObject;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
selectObject = Uri.parse("testscene.obj");
fragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.sceneFormFragment);
//when tapped on a plane, code below will run
fragment.setOnTapArPlaneListener(
(HitResult hitResult, Plane plane, MotionEvent motionEvent)->{
Anchor anchor = hitResult.createAnchor();
placeObject(fragment,anchor,selectObject);
}
);
}
//this method put 3d model in scene
private void placeObject(ArFragment fragment, Anchor anchor,Uri model){
ModelRenderable.builder()
.setSource(fragment.getContext(),model)
.build()
.thenAccept( renderable -> addNodeToScene(fragment,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 fragment, Anchor anchor, Renderable renderable){
AnchorNode anchorNode = new AnchorNode(anchor);
TransformableNode node = new TransformableNode(fragment.getTransformationSystem());
node.setRenderable(renderable);
node.setParent(anchorNode);
fragment.getArSceneView().getScene().addChild(anchorNode);
node.select();
}
}
我建議更新到最新版本的SceneForm 。 這是一個社區維護的版本,具有ArCore、Filament 和Android 的最新依賴項。 對於您的用例, 3d-model-viewer示例可能很有趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.