Reputation: 11
I'm developing an AR virtual pet application using Sceneform and ArCore in Java in Android Studio and I have a .glb model with multiple animations. In the end, I want ot make something like Pokemon Go. Currently, my code renders the model, but I can't figure out how to play the animations one after the other. Specifically, I want to play the "Congratulate" animation first, followed by the "Approach" animation.
Here's my code:
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
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.rendering.ModelRenderable;
import com.google.ar.sceneform.rendering.Renderable;
import com.google.ar.sceneform.ux.ArFragment;
import com.google.ar.sceneform.ux.BaseArFragment;
import com.google.ar.sceneform.ux.TransformableNode;
import java.lang.ref.WeakReference;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
private ArFragment arCam; //object of ArFragment Class
private int clickNo = 0; //helps to render the 3d model only once when we tap the screen
public static boolean checkSystemSupport(Activity activity) {
//checking whether the API version of the running Android >= 24 that means Android Nougat 7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
String openGlVersion = ((ActivityManager) Objects.requireNonNull(activity.getSystemService(Context.ACTIVITY_SERVICE))).getDeviceConfigurationInfo().getGlEsVersion();
//checking whether the OpenGL version >= 3.0
if (Double.parseDouble(openGlVersion) >= 3.0) {
return true;
} else {
Toast.makeText(activity, "App needs OpenGl Version 3.0 or later", Toast.LENGTH_SHORT).show();
activity.finish();
return false;
}
} else {
Toast.makeText(activity, "App does not support required Build Version", Toast.LENGTH_SHORT).show();
activity.finish();
return false;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (checkSystemSupport(this)) {
arCam = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.arCameraArea);
//ArFragment is linked up with its respective id used in the activity_main.xml
arCam.setOnTapArPlaneListener((hitResult, plane, motionEvent) -> {
clickNo++;
//the 3d model comes to the scene only when clickNo is one that means once
if (clickNo == 1) {
Anchor anchor = hitResult.createAnchor();
ModelRenderable.builder()
.setSource(this, R.raw.hund)
.setIsFilamentGltf(true)
.build()
.thenAccept(modelRenderable -> addModel(anchor, modelRenderable))
.exceptionally(throwable -> {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Somthing is not right" + throwable.getMessage()).show();
return null;
});
}
});
} else {
return;
}
}
private void addModel(Anchor anchor, ModelRenderable modelRenderable) {
AnchorNode anchorNode = new AnchorNode(anchor);
// Creating a AnchorNode with a specific anchor
anchorNode.setParent(arCam.getArSceneView().getScene());
//attaching the anchorNode with the ArFragment
TransformableNode model = new TransformableNode(arCam.getTransformationSystem());
model.setParent(anchorNode);
//attaching the anchorNode with the TransformableNode
model.setRenderable(modelRenderable);
//attaching the 3d model with the TransformableNode that is already attached with the node
model.select();
}
How can I access and play specific animations from my .glb model?
I would greatly appreciate any code snippets or resources that could help me implement this functionality. Thanks in advance!
Upvotes: 1
Views: 144
Reputation: 58583
To sequentially play multiple glb
animations in ARCore
/Sceneform
app use the following code:
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playSequentially(
ModelAnimator.ofMultipleAnimations(character, "idle", "jog", "fall")
);
animatorSet.start();
Upvotes: 0