ARCore – Is there any event for asset changed position/orientation?

Viewed 350

I am new to creating AR app using ARCore and Sceneform for Android (Java). I am building a multiplayer app using cloud anchors where two or more people can interact on one or more asset. When the asset changes it's position, how to get the event to broadcast to other connected users?

Here's my code:

private AppAnchorState appAnchorState = AppAnchorState.NONE;

private SnackbarHelper snackbarHelper = new SnackbarHelper();

private StorageManager storageManager;

private Socket mSocket;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /******************* Here **************************/
    // connect to socket

    mSocket = new ArSync().onCreate();
    mSocket.connect();
    // listen for change event

    mSocket.on("modelChanged", new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //TODO: call the application to load reslove by number
                    //textView.setText("Current ID is :" + 
                      args[0].toString());
                    Log.d("Triggered", args[0].toString());
                    onResolveOkPressed(args[0].toString());

                }
                        });
    }
});

fragment = (CustomArFragment) getSupportFragmentManager().findFragmentById(R.id.sceneform_fragment);
//To add
fragment.getPlaneDiscoveryController().hide();
fragment.getArSceneView().getScene().setOnUpdateListener(this::onUpdateFrame);

Button clearButton = findViewById(R.id.clear_button);
clearButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        setCloudAnchor(null);
    }
});


Button resolveButton = findViewById(R.id.resolve_button);
resolveButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (cloudAnchor != null){
            snackbarHelper.showMessageWithDismiss(getParent(), "Please clear Anchor");
            return;
        }
        ResolveDialogFragment dialog = new ResolveDialogFragment();
        dialog.setOkListener(MainActivity.this::onResolveOkPressed);
        dialog.show(getSupportFragmentManager(), "Resolve");

    }
});


fragment.setOnTapArPlaneListener(
        (HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {

            if (plane.getType() != Plane.Type.HORIZONTAL_UPWARD_FACING ||
                    appAnchorState != AppAnchorState.NONE){
                return;
            }

            Anchor newAnchor = fragment.getArSceneView().getSession().hostCloudAnchor(hitResult.createAnchor());

            setCloudAnchor(newAnchor);

            appAnchorState = AppAnchorState.HOSTING;
            snackbarHelper.showMessage(this, "Now hosting anchor...");


            placeObject(fragment, cloudAnchor, Uri.parse("Fox.sfb"));

        }
);

storageManager = new StorageManager(this);
}

/*.....
.......
....... 
*/

I have written a separate Socket.io server in NodeJS to broadcast the Short hand GUID to other connected nodes to download and resolve the asset at launch of the app. It works fine when I am rendering the asset for the first time. But I am not sure how to handle when one person moves that asset. I want it to render it other connected devices. I could not find any event to asset changed so that I could attach my code to it.

0 Answers
Related