Sceneform - 从屏幕像素位置获取 Vector3 位置?

Sceneform - Getting Vector3 position from screen pixel position?

Sceneform 相机有 camera.setWorldPosition 方法接受 Vector3

我目前使用 ScaleGestureDetector.

计算了用户 pinches 屏幕的中心点

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

假设用户在屏幕中间附近捏合 --- 根据 phone 的显示指标计算的 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;

        }
    }

编辑:

本质上,我试图让相机缩放 in/out 我在屏幕上捏的地方。

这不可能吗?

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

例如,在DrawingActivity中,屏幕点击用于创建光线,然后从相机创建一个Vector3DRAW_DISTANCE

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 来处理收缩和拉伸手势。