Java 如何在sceneform ARcore中将选定模型的节点放置在平面上并限制模型复制
我正在使用ARCore sceneform在增强现实上创建一个应用程序,在这个应用程序中,我在一个列表中有多个来自服务器的对象,并将这些模型放置在一个平面上(已实现)。现在我想删除放置在平面上的特定模型。每次尝试删除模型时,我都会删除最后放置的模型,而不是选定的模型Java 如何在sceneform ARcore中将选定模型的节点放置在平面上并限制模型复制,java,android,arcore,sceneform,Java,Android,Arcore,Sceneform,我正在使用ARCore sceneform在增强现实上创建一个应用程序,在这个应用程序中,我在一个列表中有多个来自服务器的对象,并将这些模型放置在一个平面上(已实现)。现在我想删除放置在平面上的特定模型。每次尝试删除模型时,我都会删除最后放置的模型,而不是选定的模型 如何获取模型的选定特定节点并删除该模型 如何限制模型的复制,使其只产生一次,而不考虑点击次数 arFragment.setOnTapArPlaneListener((hitResult,plane, motionEvent)
arFragment.setOnTapArPlaneListener((hitResult,plane, motionEvent) -> {
placeModel(hitResult.createAnchor());
});
private void placeModel(Anchor anchor) {
ModelRenderable.builder()
.setSource(ARScreenActivity.this, RenderableSource.builder()
.setSource(ARScreenActivity.this,
Uri.parse(ar_preview_model.trim()),
RenderableSource.SourceType.GLB)
.setScale(0.05f)
.setRecenterMode(RenderableSource.RecenterMode.ROOT)
.build()
)
.setRegistryId(ar_preview_model.trim())
.build()
.thenAccept(modelRenderable -> addNoteToScene(modelRenderable, anchor))
.exceptionally(throwable -> {
AlertDialog.Builder builder = new AlertDialog.Builder(ARScreenActivity.this);
builder.setMessage(throwable.getMessage()).show();
return null;
});
}
private void addNoteToScene(ModelRenderable modelRenderable, Anchor anchor) {
anchorNode = new AnchorNode(anchor);
//anchorNode.setRenderable(modelRenderable);
anchorNode.setParent(arFragment.getArSceneView().getScene());
// arFragment.getArSceneView().getScene().addChild(anchorNode);
// Create the transformable andy and add it to the anchor.
node = new TransformableNode(arFragment.getTransformationSystem());
// Node node = new Node();
// getCardPosition(node);
//set rotation in direction (x,y,z) in degrees 90
node.setLocalRotation(Quaternion.axisAngle(new Vector3(0f, 90f, 0f), 0f));
node.setLocalScale(new Vector3(x_axis, y_axis, z_axis));
node.setParent(anchorNode);
node.setRenderable(modelRenderable);
}
//从列表中删除
private void deleteSpecificProduct() {
JSONObject params = new JSONObject();
try {
params.put("Product", modelId);
} catch (JSONException e) {
e.getMessage();
}
WebServiceFactory.getInstance().removePreview(params.toString()).enqueue(new Callback<RemovePreview>() {
@Override
public void onResponse(Call<RemovePreview> call, Response<RemovePreview> response) {
if (response.body().getStatus() == 1) {
arObjectImageAdapter.notifyItemRemoved(positionForDeletion);
arObjectImageAdapter.notifyDataSetChanged();
removeARObject(anchorNode);
} else {
finish();
productImageRecyclercview.setVisibility(View.GONE);
}
}
@Override
public void onFailure(Call<RemovePreview> call, Throwable t) {
}
});
}
//多AR模型我必须限制这些模型中的每一个都应该一次显示,并且想要得到这些模型的节点
private void removeARObject(Node nodeRemove) {
if(nodeRemove instanceof AnchorNode){
if(((AnchorNode)nodeRemove).getAnchor() != null) {
((AnchorNode) nodeRemove).getAnchor().detach();
}
}
if (!(nodeRemove instanceof Camera) && !(nodeRemove instanceof Sun)) {
nodeRemove.setParent(null);
}
//Remove an anchor node
/*if (anchorNode != null) {
arFragment.getArSceneView().getScene().removeChild(anchorNode);
anchorNode.getAnchor().detach();
anchorNode.setParent(null);
anchorNode = null;
getPreviewData();
}
*/
/*
transformableNode.setParent(anchorNode );
transformableNode.setRenderable(anchorNode.getRenderable());
transformableNode.select();
transformableNode.setOnTapListener((HitTestResult hitTestResult, MotionEvent Event) ->
{
Node nodeToRemove = hitTestResult.getNode();
anchorNode.removeChild(nodeToRemove );
});
*/
}