【问题标题】:Sceneform - Getting Vector3 position from screen pixel position?Sceneform - 从屏幕像素位置获取 Vector3 位置?
【发布时间】:2021-06-21 05:53:13
【问题描述】:

Sceneform 相机具有接受Vector3camera.setWorldPosition 方法。

我目前使用ScaleGestureDetector计算了用户pinches屏幕的中心点。

我的问题是,如何根据屏幕上的单个点计算我想要移动到的 Vector3 位置?

假设用户在屏幕中间附近捏捏 --- 根据手机显示指标计算的 X 和 Y 坐标的比率为

X: 0.58122176, Y: 0.46196362

如何将其转换为 Vector3,以便我的 SceneView camera 可以放大屏幕上的那个位置?

 private class ZoomGestureDetector extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            
            float ratioX = detector.getFocusX() / displayMetrics.widthPixels;
            float ratioY = detector.getFocusY() / displayMetrics.heightPixels;

            Log.d(TAG, "onScale: Called X: " + ratioX + ", Y: " + ratioY);

            Camera camera = sceneView.getScene().getCamera();
            //camera.setWorldPosition(); <--- How to calculate vector3

            return false;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            isScaling = true;
            return true;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            isScaling = false;

        }
    }

编辑:

基本上我是在尝试让相机放大/缩小我在屏幕上捏合的位置。

这不可能吗?

【问题讨论】:

    标签: android arcore sceneform


    【解决方案1】:

    为了将 2d 点转换为 3d 点,需要添加深度。这是通过从相机通过该点创建一条射线来完成的。为了获得 Vector3,沿着该射线选取一段距离。

    例如,在DrawingActivity 中,屏幕点击用于创建射线,然后从相机创建DRAW_DISTANCE 的Vector3。

    MotionEvent tap;
    Camera camera = fragment.getArSceneView().getScene().getCamera();
    Ray ray = camera.screenPointToRay(tap.getX(), tap.getY());
    Vector3 drawPoint = ray.getPoint(DRAW_DISTANCE);
    

    您需要根据您的具体用例确定 DRAW_DISTANCE 的值。 (当您缩放时,DRAW_DISTANCE 会变小)。

    您可以查看ScaleGestureDetector 来处理捏合和拉伸手势。

    【讨论】:

    • 非常感谢您的帮助。还要感谢 ScaleGestureDetector 页面的链接——这是我计划做的下一件事!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多