要从ModelRenderable列表中选择不同的3D对象,你可以使用以下代码示例:
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.google.ar.core.Anchor;
import com.google.ar.core.HitResult;
import com.google.ar.core.Plane;
import com.google.ar.core.Trackable;
import com.google.ar.sceneform.AnchorNode;
import com.google.ar.sceneform.rendering.ModelRenderable;
import com.google.ar.sceneform.ux.ArFragment;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ArFragment arFragment;
private List modelRenderables;
private int currentModelIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.arFragment);
modelRenderables = new ArrayList<>();
modelRenderables.add(getModelRenderable("model1.sfb")); // Add your model filenames here
modelRenderables.add(getModelRenderable("model2.sfb"));
modelRenderables.add(getModelRenderable("model3.sfb"));
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addObjectToScene();
}
});
}
private void addObjectToScene() {
if (arFragment.getArSceneView().getArFrame() != null) {
// Get the center of the screen
float screenCenterX = arFragment.getArSceneView().getWidth() / 2f;
float screenCenterY = arFragment.getArSceneView().getHeight() / 2f;
// Perform a hit test at the center of the screen to check if a plane or feature point was hit
List hitTest = arFragment.getArSceneView().getArFrame().hitTest(screenCenterX, screenCenterY);
for (HitResult hit : hitTest) {
Trackable trackable = hit.getTrackable();
if (trackable instanceof Plane && ((Plane) trackable).isPoseInPolygon(hit.getHitPose())) {
// Create an anchor at the hit location
Anchor anchor = hit.createAnchor();
AnchorNode anchorNode = new AnchorNode(anchor);
anchorNode.setParent(arFragment.getArSceneView().getScene());
// Create a new instance of the selected model renderable and attach it to the anchor node
ModelRenderable selectedModel = modelRenderables.get(currentModelIndex);
currentModelIndex = (currentModelIndex + 1) % modelRenderables.size();
selectedModel.setShadowCaster(false);
selectedModel.setShadowReceiver(false);
anchorNode.setRenderable(selectedModel);
break;
}
}
}
}
private ModelRenderable getModelRenderable(String filename) {
ModelRenderable.builder()
.setSource(this, Uri.parse(filename))
.build()
.thenAccept(renderable -> modelRenderables.add(renderable))
.exceptionally(throwable -> {
// Handle loading error
return null;
});
}
}
在您的布局文件(activity_main.xml)中,添加一个Button和ArFragment:
请确保在AndroidManifest.xml文件中添加ArFragment的相关权限和配置。
这个示例代码会在AR场景中添加一个按钮,点击按钮时会在屏幕中心的平面上添加一个3D对象。每次点击按钮,会切换到不同的3D对象。您需要将3D模型文件(例如model1.sfb)放置在您的项目资源文件夹中,并在getModelRenderable方法中引用正确的文件名。
希望这个示例能帮助到你!