如何解决Sceneform - 从屏幕像素位置获取 Vector3 位置?
Sceneform 相机具有接受 camera.setWorldPosition
的 Vector3
方法。
我目前已经使用 pinches
计算了用户ScaleGestureDetector
屏幕的中心点。
我的问题是,如何根据屏幕上的单个点计算我想要移动到的 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;
}
}
编辑:
本质上,我试图让相机放大/缩小我捏在屏幕上的位置。
这不可能吗?
解决方法
为了将 2d 点转换为 3d 点,需要添加深度。这是通过从相机通过点创建光线来完成的。要获得 Vector3,需要选择沿该射线的一段距离。
例如,在 DrawingActivity 中,屏幕点击用于创建光线,然后从相机创建一个 Vector3 DRAW_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 来处理捏合和伸展手势。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。