I have a Augmented Reality App that simply shows the camera view and get's the user GPS position, azimuth, direction, inclination, etc... Also i have stored the GPS position of a famous building of my City. Now i need that when the user faces to the direction of the Building, a textview ("Building") or a image (the easiest one) must be draw on the screen pointing the Building position. For this, i need to know if the phone is facing to the GPS position of the building.
¿How can i do it? I readed some accelerometer/compass/gps tutorials but all of them are poorly explained and didn't show me how to do this, for example: http://www.devx.com/wireless/article/42482/1954 this tutorial is very poorly explained and it didn't works when i use the code, Also doesn't gives me explanations of how to show a point when u face the object and how to calculate distances Good tutorials for doing this, and code examples, are welcome. This is the code i have done. Captures user GPS position (`location`), azimuth, direction, inclination, etc... and also have stored the position of the building (`BuildingLat` & `BuildingLon`). Help will be apreciated The code (CustomCameraView class is a default camera view class, the code for that class is in the tutorial of the link i posted some lines up): public class AugmentedRealitySampleActivity extends Activity { private CustomCameraView cv=null; private TextView tv1; private TextView tv2; public static SensorManager sensorMan; private Location location; //gps public volatile float inclination; //accelerometer double BuildingLat; double BuildingLon; private static final int matrix_size = 16; float[] R = new float[matrix_size]; float[] outR = new float[matrix_size]; float[] I = new float[matrix_size]; float[] values = new float[3]; private float[] mags; private float[] accels; private float azimuth; private float incValue; LocationManager mLocationManager; MyLocationListener mLocationListener; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); cv = new CustomCameraView(this.getApplicationContext()); FrameLayout rl = new FrameLayout(this.getApplicationContext()); LinearLayout ll= new LinearLayout(this.getApplicationContext()); ll.setOrientation(LinearLayout.VERTICAL); setContentView(rl); rl.addView(cv); rl.addView(ll); tv1=new TextView(getApplicationContext()); tv2=new TextView(getApplicationContext()); ll.addView(tv1); ll.addView(tv2); sensorMan = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensorMan.registerListener(SensorListener, sensorMan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI); sensorMan.registerListener(SensorListener, sensorMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); mLocationListener = new MyLocationListener(); mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 3, mLocationListener); //getLatitude(); getLongitude(); bearingTo(); distanceTo(); tv1.setText("Test1"); tv1.setBackgroundColor(Color.BLACK); tv2.setText("Test2"); String coordinates2[] = {"39.48333", "-0.36667"}; BuildingLat = Double.parseDouble(coordinates2[0]); BuildingLon = Double.parseDouble(coordinates2[1]); } /////////////////////// GPS ///////////////////////////////////////////// private class MyLocationListener implements LocationListener { public void onLocationChanged(Location loc) { if (loc!=null) { tv1.setText("Location= " + loc.getLatitude()+" "+loc.getLongitude()); location=loc; //stores current location } else tv1.setText("null :("); } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } } //////////////////// COMPASS & ACCELEROMETER //////////////////////////// SensorEventListener SensorListener = new SensorEventListener() { public void onAccuracyChanged(Sensor arg0, int accuracy){ } public void onSensorChanged(SensorEvent event) { if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) return; switch (event.sensor.getType()) { case Sensor.TYPE_MAGNETIC_FIELD: mags = event.values.clone(); break; case Sensor.TYPE_ACCELEROMETER: accels = event.values.clone(); break; } if (mags != null && accels != null) { SensorManager.getRotationMatrix(R, I, accels, mags); //Correct if screen is in Landscape SensorManager.remapCoordinateSystem(R,SensorManager.AXIS_X,SensorManager.AXIS_Z, outR); SensorManager.getOrientation(outR, values); incValue=SensorManager.getInclination(I); azimuth = (float) Math.round((Math.toDegrees(values[0]))*2)/2; //Adjust the range: 0 < range <= 360 (from: -180 < range <= 180). azimuth = ( azimuth + 360)%360; // alternative: mAzimuth = mAzimuth>=0 ? mAzimuth : mAzimuth+360; tv2.setText("Azimuth (deg)= " + azimuth); tv2.append("\n Azimuth (rad)= " + values[0]); inclination=-Math.round((float) (values[1]*(360/(2*Math.PI)))); tv2.append("\n Pitch (rad)= " + values[1]); tv2.append("\n Pitch (deg)= " + inclination); tv2.append("\n Roll (rad)= " + (values[2]*(360/(2*Math.PI)))); } } }; } -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en