www.jpct.net

jPCT-AE - a 3d engine for Android => Support => Topic started by: tinhtinhcd on May 26, 2017, 09:08:44 am

Title: glPushMatrix() & glPopMatrix()
Post by: tinhtinhcd on May 26, 2017, 09:08:44 am
I have to rotate object around the axis

Code: [Select]
public void onDrawFrame(GL10 gl) {
....
parentObj.rotateAxis(new SimpleVector(mPquart[1],mPquart[2],mPquart[3]),mPquart[0]);
...
}

The problem is mPquart is Quaternion and get from SensorManager.
So, I need something like glPushMatrix() & glPopMatrix() to make the object stable when I don't rotate the phone.
How can I do it.

I try gl.glPushMatrix(); and gl.glPopMatrix(); but nothing happen.
Title: Re: glPushMatrix() & glPopMatrix()
Post by: EgonOlsen on May 26, 2017, 11:04:50 am
You are not supposed to do direct GL calls within jPCT-AE. Either convert your quat to angles or a Matrix and use the rotation methods or setRotationMatrix() on the Object3D. Also keep in mind that jPCT's coordinate system differs from that of OpenGL, so you have to convert the matrix. The Matrix class itself should have methods for this. Anyway, this problem has been solved in the past IIRC, so either the Wiki or this should actually provide some help as well.
Title: Re: glPushMatrix() & glPopMatrix()
Post by: tinhtinhcd on June 06, 2017, 09:48:34 am
Hi,
I'm not good at Math. Base on what I understand. Is this what I need.

Code: [Select]
private Matrix convertMatrix(){
        Matrix matrix = new Matrix();

       float angle = (float)  Math.acos(mPquart[0]);
        float c = (float) Math.cos(angle);
        float s = (float) Math.sin(angle);
        float x = mPquart[1];
        float y = mPquart[2];
        float z = mPquart[3];

        float[] dump = new float[16];

        dump[0] = x*x*(1-c)+c;
        dump[1] = x*y*(1-c)-z*s;
        dump[2] = x*z*(1-c)+y*s;
        dump[3] = 0f;
        dump[4] = y*x*(1-c)+z*s;
        dump[5] = y*2*(1-c)+c;
        dump[6] = y*z*(1-c)-x*s;
        dump[7] = 0f;
        dump[8] = x*z*(1-c)-y*s;
        dump[9] = y*z*(1-c)+x*s;
        dump[10] = z*2*(1-c)+c;
        dump[11] = 0f;
        dump[12] = 0f;
        dump[13] = 0f;
        dump[14] = 0f;
        dump[15] = 1f;

        matrix.fillDump(dump);

        return matrix;
    }
and
Code: [Select]
obj.setRotationMatrix(convertMatrix());
Title: Re: glPushMatrix() & glPopMatrix()
Post by: tinhtinhcd on June 08, 2017, 05:56:45 am
Hi, the above code work but it is not what i need for my project.

My app connect with a real device and receive quaternion data from that.
What I need is when my device rotate in real world, the object must rotate the same way.
Currently, it only work when i put the these XAxis in same direction.

thanks.
Title: Re: glPushMatrix() & glPopMatrix()
Post by: EgonOlsen on June 08, 2017, 07:56:47 am
I'm not sure what kind of matrix the code above is supposed to create. One in jPCT's coordinate system or one in OpenGL's? If it's the latter, try to apply this method on the resulting matrix: http://www.jpct.net/jpct-ae/doc/com/threed/jpct/Matrix.html#transformToGL() (http://www.jpct.net/jpct-ae/doc/com/threed/jpct/Matrix.html#transformToGL())
Title: Re: glPushMatrix() & glPopMatrix()
Post by: tinhtinhcd on June 09, 2017, 06:15:40 am
Hi,
after check again,
I see my matrix is not correct, so I update it and use transformToGL();
Code: [Select]
Matrix matrix = new Matrix();

        float x = mPquart[1];
        float y = mPquart[2];
        float z = mPquart[3];
        float w = mPquart[0];

        float[] dump = new float[16];

        final float xx = x * x;
        final float xy = x * y;
        final float xz = x * z;
        final float xw = x * w;
        final float yy = y * y;
        final float yz = y * z;
        final float yw = y * w;
        final float zz = z * z;
        final float zw = z * w;

        dump[0] = 1 - 2 * (yy + zz);
        dump[4] = 2 * (xy - zw);
        dump[8] = 2 * (xz + yw);
        dump[12] = 0;
        dump[1] = 2 * (xy + zw);
        dump[5] = 1 - 2 * (xx + zz);
        dump[9] = 2 * (yz - xw);
        dump[13] = 0;
        dump[2] = 2 * (xz - yw);
        dump[6] = 2 * (yz + xw);
        dump[10] = 1 - 2 * (xx + yy);
        dump[14] = 0;
        dump[3] = 0;
        dump[7] = 0;
        dump[11] = 0;
        dump[15] = 1;

        matrix.setDump(dump);

       matrix.transformToGL();

I saw the object rotate different, but I still have a problem.
When I rotate my device on xAxis, it will rotate y or z, it only rotate properly when i put the device and my phone same direction.
Is there anything that I miss.

Thanks so much for support. 
Title: Re: glPushMatrix() & glPopMatrix()
Post by: tinhtinhcd on June 09, 2017, 08:09:03 am
Finally it work as expectation.
But a strange thing that I must switch z<=>y and x=-x.
I have no idea why it work on that way.