Peli, I think I love you :) No seriously, I changed:
SensorManager.AXIS_X,SensorManager.AXIS_Z, To SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X and it basically works, its slightly out but I am almost sure its down to my projection code being slightly wrong ;) Three days of bother and one line of code solved it... I'll reply again if I run into any more problems (so please check back :D). Thanks again! On Aug 20, 7:17 pm, Peli <[email protected]> wrote: > A couple of possible issues come to my mind: > > * Did you make sure that your compass is calibrated? (figure 8 in the > air with the phone several times in various directions) > * Are you far enough away from computers, steel, loudspeakers, or > other objects that may deflect magnetic field lines (and thus alter > the compass readings)? > * For a change portrait -> landscape, it would make more sense to > remap x and y coordinates by 90 degrees, rather than swap x and z > coordinates, like SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, > > If all of these don't help, it is more efficient to print out (logcat) > the sensor values, and try to solve one problem at a time (like, first > get the correct orientation values from the compass, and if that > works, then look into your projection routine), rather than solving > the whole stack of possible error sources at once. > > Good luck :-) > Peli > > On Aug 20, 7:02 pm, mscwd01 <[email protected]> wrote: > > > I should add I am holding the phone horizontally (as you would when > > taking a photo). > > > As such I modify the sensor values like: > > > SensorManager.getRotationMatrix(R, I, accels, mags); > > SensorManager.remapCoordinateSystem(R,SensorManager.AXIS_X, > > SensorManager.AXIS_Z, outR); > > SensorManager.getOrientation(outR, values); > > > I'm assuming thats the correct way to do it. > > > On Aug 20, 6:00 pm, mscwd01 <[email protected]> wrote: > > > > The main problem is when I use the values returned by the sensor > > > manager "as is" i.e. not modifying them in any way, the points are no > > > where near where they should be. For example, say the point I wish to > > > project is due north of my current location and at the same elevation. > > > I shouldn't need to tilt (pitch) the phone up or down and when I hold > > > the phone in the direction of north it should appear somewhere near > > > the center of the phone screen. However, this is not the case, in > > > reality for the point to appear on the center of the screen I need to > > > do something like tilt the phone at the ground and orient it in a > > > easterly direction for example. > > > > I have made a nasty fix which means I subtract 90 from the roll or add > > > 45 degrees to the pitch etc. However while this now projects the point > > > on the center of the screen it ruins the projections of any other > > > points (as I have fundamentally altered the sensor values). In my > > > current implementation a point north of me may work but any points to > > > the south do not work. > > > > My problem is probably something to do with the coordinates of the > > > phone differing from my projected coordinates, but making the two > > > "work" together is causing me some serious headaches. > > > > I can send you my projection code if it helps, I have really exhausted > > > all ideas to solve my issue! > > > > Thanks for the reply > > > > On Aug 20, 5:15 pm, Peli <[email protected]> wrote: > > > > > > however, I can never seem to get accurate screen coordinates > > > > > of the points. > > > > > Could you specify what exactly your problem is? > > > > Does it not work *at all*, or does it work basically, but points are > > > > off by a few degrees? Or does it only work in one orientation of the > > > > device (like in landscape mode), and fails in other orientations? > > > > > Peliwww.openintents.orghttp://code.google.com/p/openintents/wiki/SensorSi... > > > > > On Aug 20, 4:55 pm, mscwd01 <[email protected]> wrote: > > > > > > Hi, > > > > > > I want to find the screen coordinates (X,Y) where a point represented > > > > > by a latitude/longitude value would appear on the screen if you > > > > > pointed your phone at it (much in the same way as Wikitude does). > > > > > > Here is my code from my onSensorChanged() method: > > > > > > public void onSensorChanged(SensorEvent event) { > > > > > Sensor sensor = event.sensor; > > > > > int type = sensor.getType(); > > > > > > switch (type) { > > > > > case Sensor.TYPE_MAGNETIC_FIELD: > > > > > mags = event.values.clone(); > > > > > isReady = true; > > > > > break; > > > > > case Sensor.TYPE_ACCELEROMETER: > > > > > accels = event.values.clone(); > > > > > break; > > > > > case Sensor.TYPE_ORIENTATION: > > > > > orients = event.values.clone(); > > > > > break; > > > > > } > > > > > > if (mags != null && accels != null && isReady) { > > > > > isReady = false; > > > > > > SensorManager.getRotationMatrix(R, I, accels, > > > > > mags); > > > > > SensorManager.remapCoordinateSystem(R, > > > > > SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); > > > > > SensorManager.getOrientation(outR, values); > > > > > > azimuth = convert.radToDeg(values[0]); > > > > > pitch= convert.radToDeg(values[1]); > > > > > roll = convert.radToDeg(values[2]); > > > > > > } > > > > > > } > > > > > > I convert the points I wish to project from their lat/lon spherical > > > > > coordinates to Cartesian coordinates and perform a perspective > > > > > projection using the roll, pitch and azimuth values returned by the > > > > > sensor, however, I can never seem to get accurate screen coordinates > > > > > of the points. > > > > > > The matrices for roll, pitch and azimuth I use are: > > > > > > // pan > > > > > double[][] azimuthMat = { > > > > > {Math.cos(azimuthValue), -Math.sin(azimuthValue), 0}, > > > > > {Math.sin(azimuthValue), Math.cos(azimuthValue), 0}, > > > > > {0, 0, 1},}; > > > > > > // tilt > > > > > double[][] pitchMat = { > > > > > {Math.cos(pitchValue), 0, Math.sin(pitchValue)}, > > > > > {0, 1, 0}, > > > > > {-Math.sin(pitchValue), 0, Math.cos(pitchValue)}, > > > > > }; > > > > > // roll > > > > > double[][] rollMat = { > > > > > {1, 0, 0}, > > > > > {0, Math.cos(rollValue), -Math.sin(rollValue)}, > > > > > {0, Math.sin(rollValue), Math.cos(rollValue)}, > > > > > }; > > > > > > I also perform the necessary translation of the projection cener and > > > > > the point to project e.g: > > > > > > // Translate the point > > > > > subtract(pointToProject, projectionCenter); > > > > > ... where 'pointToProject' and 'projectionCenter' are double arrays > > > > > holding the Cartesian coordinates of each location (i.e. camera lat/ > > > > > lon and the point to project lat/lon) > > > > > > I realise this is quite a complicated question to ask and I haven't > > > > > provided all my projection code etc, however if someone feels they can > > > > > help me out and may know how to achieve what i'm after - i'll post the > > > > > whole code. > > > > > > Thanks --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---

