简体   繁体   中英

Manual Rotation of 3D Object - Android

I'm trying to rotate a 3D object freely which loaded using SceneView without AR.

I want the rotation to take place whenever the user swipe on the screen.

Enabling RotationController and ScaleController while keeping TranslationContoller Disabled didn't solve my issue. The object still can't be Rotated manually.

How should I modify my code to enable freely 360° rotation?

Any Help would be really appreciated.

Following is my code till now

SceneView sceneView;
Scene scene;
private TransformationSystem ts;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sceneView = findViewById(R.id.scene_view);
        scene = sceneView.getScene();

        createScene();

    }
    private void createScene() {
        ModelRenderable.builder()
                .setSource(this, R.raw.skeleton2 )
                .build()
                .thenAccept(renderable -> onRenderableLoaded(renderable))
                .exceptionally(   throwable -> {
                    Toast toast =
                            Toast.makeText(this, "Unable to load model", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                    return null;
                });
    }

    void onRenderableLoaded(Renderable model) {
        ts = new TransformationSystem(getResources().getDisplayMetrics(), new FootprintSelectionVisualizer());
        DisplayMetrics displayMetrics= getResources().getDisplayMetrics();

        TransformableNode transnode = new TransformableNode(ts);
        RotationController rotationController = transnode.getRotationController();
        rotationController.setEnabled(true);
        ts.selectNode(transnode);
        transnode.setRenderable(model);
        transnode.setLocalRotation(Quaternion.eulerAngles(new Vector3(-30f,0,0f)));
        transnode.getRotationController().setEnabled(true);
        transnode.getScaleController().setEnabled(true);
        transnode.getTranslationController().setEnabled(false);
        scene.addChild(transnode);
        transnode.setLocalPosition(new Vector3(0,0,0));

        scene.addOnPeekTouchListener(new Scene.OnPeekTouchListener() {
            @Override
            public void onPeekTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
                ts.onTouch(hitTestResult,motionEvent);
            }
        });

        Camera camera = scene.getCamera();
        camera.setLocalPosition(new Vector3(0f,3f,1.5f));
        camera.setLocalScale(new Vector3(3f,3f,1.5f));
        camera.setLocalRotation(Quaternion.axisAngle(Vector3.right(), -50.0f));


        //GesturePointersUtility gesturePointersUtility = new GesturePointersUtility(displayMetrics);

    }
    @Override
    public void onPause() {
        super.onPause();
        sceneView.pause();
    }

    @Override
    public void onResume() {
        super.onResume();
        try {
            sceneView.resume();
        } catch (CameraNotAvailableException e) {
            e.printStackTrace();
        }
    }```



  [1]: https://i.stack.imgur.com/fEJV5.png

Why don't you just make a GestureListener that listens for screen swipes and gets the speed of the swipe and use that to set a new rotation for your object with respect to its current rotation. More info .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM