java - 如何在不点击的情况下在 arCore 平面中设置 3d 模型
问题描述
我想在检测到平面时立即在 ARcore 的随机部分设置 3d 模型。不确定使用哪种方法进行设置。
addOnUpdateListener(this::onUpdate);
private void onUpdate(FrameTime frameTime) {
if (numOfModels > 0) return;
modelLoader1 = new ModelLoader(weakReference);
Frame frame = arFragment.getArSceneView().getArFrame();
Collection<Plane> planes = frame.getUpdatedTrackables(Plane.class);
for (Plane plane : planes) {
if (plane.getTrackingState() == TrackingState.TRACKING) {
addObject(Uri.parse("andy_dance.sfb"));
break;
}
}
}
private void addObject(Uri model) {
Frame frame = arFragment.getArSceneView().getArFrame();
android.graphics.Point pt = getScreenCenter();
List<HitResult> hits;
if (frame != null) {
hits = frame.hitTest(pt.x, pt.y);
for (HitResult hit : hits) {
Trackable trackable = hit.getTrackable();
if (trackable instanceof Plane &&
((Plane) trackable).isPoseInPolygon(hit.getHitPose())) {
modelLoader1.loadModel(hit.createAnchor(), model);
break;
}
}
}
}
public void loadModel(Anchor anchor, Uri uri) {
if (owner.get() == null) {
Log.d(TAG, "Activity is null. Cannot load model.");
return;
}
ModelRenderable.builder()
.setSource(owner.get(), uri)
.build()
.handle((renderable, throwable) -> {
MainActivity activity = owner.get();
if (activity == null) {
return null;
} else if (throwable != null) {
activity.onException(throwable);
} else {
activity.addNodeToScene(anchor, renderable);
}
return null;
});
return;
}
public void addNodeToScene(Anchor anchor, ModelRenderable renderable) {
numOfModels++;
AnchorNode anchorNode = new AnchorNode(anchor);
TransformableNode node = new TransformableNode(arFragment.getTransformationSystem());
node.setRenderable(renderable);
node.setParent(anchorNode);
node.setLocalPosition(new Vector3(0f, 0f, 0f));
modelLoader1.setNumofLivesModel0(2);
arFragment.getArSceneView().getScene().addChild(anchorNode);
setNodeListener(node, anchorNode, modelLoader1);
到目前为止,我可以用一个模型填充屏幕,但在屏幕的中心,如果可能的话,我们现在希望将模型设置在角落
解决方案
在活动开始时,我实例化了一个新的 Vector3 对象,以便稍后将其用于 3d 模型定位:
vector = new Vector3();
通过实现一个 ARCore 识别为手机位置的世界锚来解决这个问题:
AnchorNode anchorNode = new AnchorNode();
anchorNode.setWorldPosition(new Vector3(0, 0, 0));
使用 AnchorNode 集,我们能够在世界中定位一个对象,知道它实际在哪里。
vector.set(randomCoordinates(true), randomCoordinates(false), -.7f);
AnchorNode anchorNode = new AnchorNode();
TransformableNode node = new TransformableNode(arFragment.getTransformationSystem());
node.setRenderable(ModelRenderable);
node.setParent(anchorNode);
node.setWorldPosition(vector);
vector.set() 接受的参数是 3 个浮点数,它们是 x、y、z 坐标。为了使 3d 模型显示在您的相机前,建议 x 坐标在 -.300 到 .300 之间,y 坐标在 -.500 到 .500 之间,z 坐标介于 -.7 到 1 之间。
推荐阅读
- python - 计算字符串中出现的次数
- ethereum - 为私有以太坊部署设置生产和登台环境
- forms - 我应该如何在不禁用帐户的情况下制作带有密码并确认密码字段的表单?
- regex - html中标签之间的搜索模式
- c# - foreach 中的异步调用不执行以下开关
- android - 为 stateFlow 编写单元测试
- flutter - toJson 无法正常工作 json 序列化程序未处理的异常:无效参数:“DietModel”的实例
- php - 将 IF 语句添加到 PHP
- filter - 为什么我的 Jupyter Notebook 上没有交互元素?
- javascript - 坚持使用 D3.js – 使用多维数组构建一个在另一个之上的矩形