ARCore - Есть ли событие для изменения позиции / ориентации актива? - PullRequest
0 голосов
/ 31 августа 2018

Я новичок в создании приложения AR с использованием ARCore и Sceneform для Android (Java). Я создаю многопользовательское приложение с использованием облачных якорей, в котором два или более человека могут взаимодействовать с одним или несколькими активами. Когда актив меняет свою позицию, как заставить событие транслироваться другим подключенным пользователям?

Вот мой код:

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);
}

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

Я написал отдельный Socket.io сервер в NodeJS для передачи сокращенного GUID на другие подключенные узлы для загрузки и разрешения ресурса при запуске приложения. Он отлично работает, когда я рендеринг актива в первый раз. Но я не уверен, как справиться, когда один человек перемещает этот актив. Я хочу, чтобы он отображал другие подключенные устройства. Я не смог найти событие для изменения ресурса, чтобы я мог присоединить к нему свой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...