Here is the code.
This code uses arrays that are declared static (less memory
allocations). It is not thread-safe at all. You could infer the thread-
safe version of this method through the comments.
private static final float[] _tempGluUnProjectData = new float[40];
private static final int _temp_m = 0;
private static final int _temp_A = 16;
private static final int _temp_in = 32;
private static final int _temp_out = 36;
public static int gluUnProject(float winx, float winy, float winz,
float model[], int offsetM,
float proj[], int offsetP,
int viewport[], int offsetV,
float[] xyz, int offset)
{
/* Transformation matrices */
// float[] m = new float[16], A = new float[16];
// float[] in = new float[4], out = new float[4];
/* Normalize between -1 and 1 */
_tempGluUnProjectData[_temp_in] = (winx - viewport[offsetV]) *
2f / viewport[offsetV+2] - 1.0f;
_tempGluUnProjectData[_temp_in+1] = (winy - viewport[offsetV+1]) *
2f / viewport[offsetV+3] - 1.0f;
_tempGluUnProjectData[_temp_in+2] = 2f * winz - 1.0f;
_tempGluUnProjectData[_temp_in+3] = 1.0f;
/* Get the inverse */
android.opengl.Matrix.multiplyMM(_tempGluUnProjectData, _temp_A,
proj, offsetP, model, offsetM);
android.opengl.Matrix.invertM(_tempGluUnProjectData, _temp_m,
_tempGluUnProjectData, _temp_A);
android.opengl.Matrix.multiplyMV(_tempGluUnProjectData, _temp_out,
_tempGluUnProjectData, _temp_m,
_tempGluUnProjectData, _temp_in);
if (_tempGluUnProjectData[_temp_out+3] == 0.0)
return GL10.GL_FALSE;
xyz[offset] = _tempGluUnProjectData[_temp_out ] /
_tempGluUnProjectData[_temp_out+3];
xyz[offset+1] = _tempGluUnProjectData[_temp_out+1] /
_tempGluUnProjectData[_temp_out+3];
xyz[offset+2] = _tempGluUnProjectData[_temp_out+2] /
_tempGluUnProjectData[_temp_out+3];
return GL10.GL_TRUE;
}
On Feb 26, 1:22 pm, focuser <[email protected]> wrote:
> hmm, thanks a lot for replies from both of you!
>
> It's surprising though that gluUnProject didn't work.
>
> There is a comment in MatrixTrackingGL.java
>
> * Note: the actual matrix may differ from the retrieved matrix, due
> * to differences in the way the math is implemented by
> GLMatrixWrapper
> * as compared to the way the math is implemented by the OpenGL ES
> * driver.
>
> Maybe that's why?
>
> On Feb 26, 8:59 am, Streets Of Boston <[email protected]> wrote:
>
>
>
> > I had similar issues:
> > - Where to obtain the model-view and the project-view matrices.
> > - gluUnProject did not seem to work... it returned results i did not
> > expect.
>
> > I solved these issues:
> > - I borrowed code from the MatrixGrabber.java you can find in the "API
> > Demos" examples. This class contains methods to obtain the project and
> > model view matrices.
> > - I wrote my own gluUnProject, based upon a C-implementation i found
> > on the internet.
>
> > Gotohttp://soft.antonspaans.comandleave me a message there and i
> > can send you the java source code for gluUnProject.
>
> > On Feb 24, 8:10 pm, focuser <[email protected]> wrote:
>
> > > Hi,
>
> > > I'm trying to convert window coordinates to object coordinates.
> > > There's a gluUnProject in GLU class, which requires current modelview,
> > > projection matrices and viewport.
>
> > > My question is how to get those matrices? I tried gl.glGetIntegerv
> > > (GL11.GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES, model, 0); and
> > > ((GL11) gl).glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelf, 0);
>
> > > but the first one returns an array of zeros, and the other one just
> > > shows an "method not implemented" error.
>
> > > Is gluUnProject the correct method for this purpose (i.e. window
> > > coordinates --> object coordinates) ?- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---