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