Sceneform for ARCore create box method



我正在尝试使用ShapeFactory在Sceneform for Android ARCore中创建一个简单的红色框。我找不到这样的例子,最接近的是改变现有物体上的材质。 下面我认为我的代码大部分是正确的,尝试为盒子创建一个节点并将其附加到锚节点,实际的盒子材料、几何形状和位置也被创建和附加为节点的可渲染对象。 该错误显示从未使用"boxo",并且在尝试设置时无法识别"boxo"渲染((

package com.google.ar.sceneform.samples.hellosceneform;
import android.app.Activity;
import android.app.ActivityManager;
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.Gravity;
import android.view.MotionEvent;
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.math.Vector3;
import com.google.ar.sceneform.rendering.Color;
import com.google.ar.sceneform.rendering.MaterialFactory;
import com.google.ar.sceneform.rendering.ModelRenderable;
import com.google.ar.sceneform.rendering.Renderable;
import com.google.ar.sceneform.rendering.ShapeFactory;
import com.google.ar.sceneform.ux.ArFragment;
import com.google.ar.sceneform.ux.TransformableNode;
import static com.google.ar.sceneform.rendering.ShapeFactory.makeCube;
/**
* This is an example activity that uses the Sceneform UX package to make common AR tasks easier.
*/
public class HelloSceneformActivity extends AppCompatActivity {
private static final String TAG = HelloSceneformActivity.class.getSimpleName();
private static final double MIN_OPENGL_VERSION = 3.0;
private ArFragment arFragment;
private ModelRenderable pipesRenderable;
@Override
@SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"})
// CompletableFuture requires api level 24
// FutureReturnValueIgnored is not valid
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!checkIsSupportedDeviceOrFinish(this)) {
return;
}
setContentView(R.layout.activity_ux);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
// When you build a Renderable, Sceneform loads its resources in the background while returning
// a CompletableFuture. Call thenAccept(), handle(), or check isDone() before calling get().
ModelRenderable.builder()
.setSource(this, Uri.parse("pipes.sfb"))
.build()
.thenAccept(renderable -> pipesRenderable = renderable)
.exceptionally(
throwable -> {
Toast toast =
Toast.makeText(this, "Unable to load pipes renderable", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return null;
});
arFragment.setOnTapArPlaneListener(
(HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {
if (pipesRenderable == null) {
return;
}
// Create the Anchor.
Anchor anchor = hitResult.createAnchor();
AnchorNode anchorNode = new AnchorNode(anchor);
anchorNode.setParent(arFragment.getArSceneView().getScene());
// Create the transformable andy and add it to the anchor.
TransformableNode pipes = new TransformableNode(arFragment.getTransformationSystem());
pipes.setParent(anchorNode);
pipes.setRenderable(pipesRenderable);
pipes.select();
TransformableNode cube = new TransformableNode(arFragment.getTransformationSystem());
cube.setParent(anchorNode);
// MaterialFactory
// ModelRenderable box = ShapeFactory.makeCube(new Vector3(1f, 1f, 1f), new Vector3(0.0f, 0.15f, 0.0f), boxMat);
//
MaterialFactory.makeOpaqueWithColor(this, new Color(android.graphics.Color.RED))
.thenAccept(
material -> {
ModelRenderable boxo = ShapeFactory.makeCube(new Vector3(1f, 1f, 1f), new Vector3(1f, 1f, 1f), material); });
cube.setRenderable(boxo);
cube.select();
});
}
}
*/
/**
* Returns false and displays an error message if Sceneform can not run, true if Sceneform can run
* on this device.
*
* <p>Sceneform requires Android N on the device as well as OpenGL 3.0 capabilities.
*
* <p>Finishes the activity if Sceneform can not run
*/
public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) {
if (Build.VERSION.SDK_INT < VERSION_CODES.N) {
Log.e(TAG, "Sceneform requires Android N or later");
Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show();
activity.finish();
return false;
}
String openGlVersionString =
((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE))
.getDeviceConfigurationInfo()
.getGlEsVersion();
if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) {
Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later");
Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG)
.show();
activity.finish();
return false;
}
return true;
}
}

这是执行此操作的方法:

arFragment.setOnTapArPlaneListener(
(HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {
if (andyRenderable == null) {
return;
}
// Create the Anchor.
Anchor anchor = hitResult.createAnchor();
AnchorNode anchorNode = new AnchorNode(anchor);
anchorNode.setParent(arFragment.getArSceneView().getScene());

MaterialFactory.makeTransparentWithColor(getApplicationContext(), new Color(244, 244, 244))
.thenAccept(
material -> {
Vector3 vector3 = new Vector3(0.05f, 0.05f,0.05f);
ModelRenderable model = ShapeFactory.makeCube(vector3,
Vector3.zero(), material);
model.setShadowCaster(false);
model.setShadowReceiver(false);
TransformableNode transformableNode = new TransformableNode(arFragment.getTransformationSystem());
transformableNode.setParent(anchorNode);
transformableNode.setRenderable(model);
transformableNode.select();
});
}

您的变量 boxo 仅在 lambda 中有效。将其更改为:

MaterialFactory.makeOpaqueWithColor(this, new Color(android.graphics.Color.RED))
.thenAccept(
material -> {
ModelRenderable boxo = ShapeFactory.makeCube(new Vector3(1f, 1f, 1f), new Vector3(1f, 1f, 1f), material); 
cube.setRenderable(boxo);
cube.select();
});

它会工作

最新更新