使用ARCore 1.13或更高版本,可以使用GeoApiManager类中的静态方法getInverseProjectionMatrix()来获取相机的投影矩阵,然后使用该矩阵将三维点转换为屏幕坐标。然后,可以使用反向的屏幕坐标来查询附近的建筑物,从而确定相机指向的建筑物。
以下是一个示例代码,根据相机指向的建筑物,当用户打开相机时,在屏幕上显示该建筑物的名称。
private Frame frame;
private Session session;
private List planes;
private ArrayList buildings = new ArrayList<>();
private TextView buildingTextView;
private boolean isLookingAtBuilding = false;
private final float[] screenPoint = new float[2];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buildingTextView = findViewById(R.id.building_textview);
session = new Session(this);
frame = session.update();
// Initialize buildings list
buildings.add(new Building("Building A", 34.068921, -118.445181));
buildings.add(new Building("Building B", 34.069104, -118.444497));
}
@Override
protected void onResume() {
super.onResume();
// Make sure ARCore is installed and up to date
ArCoreApk.getInstance().requestInstall(this, true);
// Start camera
ArFragment arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ar_fragment);
arFragment.getArSceneView().setupSession(session);
arFragment.getArSceneView().setLightEstimationEnabled(false);
arFragment.getArSceneView().getSession().resume();
arFragment.getArSceneView().getScene().addOnUpdateListener(this);
}
@Override
protected void onPause() {
super.onPause();
if (session != null) {
arFragment.getArSceneView().getSession().pause();
}
}
@Override
public void onUpdate(FrameTime frameTime) {
// Get closest plane to camera
planes = session.getAllTrackables(Plane.class);
Plane closestPlane = null;
float closestPlaneDistance = Float.MAX_VALUE;
for (Plane plane : planes) {
float cameraDistance = plane.getCenterPose().ty();
if (cameraDistance < closestPlaneDistance) {
closestPlane = plane;
closestPlaneDistance = cameraDistance;
}
}
// Only look for buildings if the user is looking at the closest plane
if (closestPlane != null
下一篇:ARCore多图像跟踪