# calculate point from matrix

This topic is 4818 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hi, This is a simplified version of a post i made a little while ago. Recently i have needed to obtain a points new position from a matrix. The matrix i use is obtained from the current matrix where a gl transformation has been applied. The problem is that the resulatant point that i calculate keeps moving when the camera is simply moved? this has never happened before but since implementing it into my project it has delayed m progress. Does anyone know why this is happening. heres my display code: glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(vAng, asp, nearD, farD); glMatrixMode(GL_MODELVIEW); // Modeling transformation glLoadIdentity(); // Initialize the model matrix as identity gluLookAt(.....); cam.SetViewByMouse(screenWidth, screenHeight); // Move the camera by the mouse MATRIXSTRUCT myMatTest; MATRIXSTRUCT myMatTest1; glPushMatrix(); glTranslatef(10,0,0); glGetDoublev(GL_MODELVIEW_MATRIX,myMatTest.myRotMatArrray); DoubleArrayToMatrix(myMatTest.myRotMatix,myMatTest.myRotMatArrray); glPopMatrix(); Point3 myPoint;myPoint.set(0,0,0); Point3 myPointTemp;myPointTemp.set(setNexVertexPosPoint(myMatTest.myRotMatix,myPoint)); glPushMatrix(); glTranslatef(myPoint.x,myPoint.y,myPoint.z); glutWireSphere(10,5,5); glPopMatrix(); this is to simply draw two spheres one at 0,0,0 and the other at 10,0,0. the second sphere however moves :( just incase someone asks here is the MATRIXSTRUCT struct typedef struct matrixStruct { GLdouble myRotMatArrray[16]; matrix_4x4_type myRotMatix; //collision detection eye coords required }MATRIXSTRUCT; plz help me :) cheers

##### Share on other sites
I can see you only drawing one sphere...

##### Share on other sites
yeah sorry missed that off :)
cheers for spotting

glMatrixMode(GL_PROJECTION);
gluPerspective(vAng, asp, nearD, farD);
glMatrixMode(GL_MODELVIEW); // Modeling transformation
glLoadIdentity(); // Initialize the model matrix as identity

gluLookAt(.....);

cam.SetViewByMouse(screenWidth, screenHeight); // Move the camera by the mouse

MATRIXSTRUCT myMatTest;
MATRIXSTRUCT myMatTest1;

glPushMatrix();

glTranslatef(10,0,0);
glGetDoublev(GL_MODELVIEW_MATRIX,myMatTest.myRotMatArrray);
DoubleArrayToMatrix(myMatTest.myRotMatix,myMatTest.myRotMatArrray);

glPopMatrix();

Point3 myPoint;myPoint.set(0,0,0);
Point3 myPointTemp;myPointTemp.set(setNexVertexPosPoint(myMatTest.myRotMatix,myPoint));

glPushMatrix();
glTranslatef(myPoint.x,myPoint.y,myPoint.z);
glutWireSphere(10,5,5);
glPopMatrix();

glPushMatrix();
glTranslatef(myPointTemp.x,myPointTemp.y,myPointTemp.z);
glutWireSphere(10,5,5);
glPopMatrix();

##### Share on other sites
Quote:
 Original post by JARVIS_UKPoint3 myPointTemp;myPointTemp.set(setNexVertexPosPoint(myMatTest.myRotMatix,myPoint));

What is that line actually doing?

##### Share on other sites
What i'm attempting to do is to store the glTranslatef(10,0,0) as a named matrix. Then using the function setNexVertexPosPoint i pass a point and the named matrix to obtain the points new position i.e +10 on the x axis.
therefore when a translation is performed with the new points position it should move objects to that point.
The spheres are drawn to see if its working properly.

this is the function used to obtain the new point from the old point and the named matrix.

vertex_type setNexVertexPos(matrix_4x4_type MyMat, vertex_type verTemp){
vertex_type verFinal;
matrix_1x4_type resultant;
matrix_1x4_type equal;
equal[0] = verTemp.x;
equal[1] = verTemp.y;
equal[2] = verTemp.z;
equal[3] = 1;
MatrMul_1x4_4x4(equal,MyMat,resultant);

verFinal.x=resultant[0];
verFinal.y=resultant[1];
verFinal.z=resultant[2];

return verFinal;
}

/**********************************************************
*
* SUBROUTINE MatrMul_1x4_4x4 (matrix_1x4_type p_matrix1, matrix_4x4_type p_matrix2, matrix_1x4_type p_matrix_res)
*
* This subroutine multiply a vector by a 4x4 matrix to generate a new vector
*
* Input parameters: p_matrix1 = Vector1
* p_matrix2 = Matrix
* p_matrix_res = New Vector = Vector1 x matrix
*
*********************************************************/

void MatrMul_1x4_4x4 (matrix_1x4_type p_matrix1, matrix_4x4_type p_matrix2, matrix_1x4_type p_matrix_res)
{
int j,k;
float l_sum;

for (j=0;j<4;j++)
{
l_sum=0;
for(k=0;k<4;k++)
l_sum+=p_matrix1[k]*p_matrix2[k][j];
p_matrix_res[j]=l_sum;
}
}

##### Share on other sites
Quote:
 Original post by JARVIS_UKWhat i'm attempting to do is to store the glTranslatef(10,0,0) as a named matrix.

You aren't doing this though. glPushMatrix doesn't reset the current modelview matrix to identity - but keep what is now at the level below. This means, the matrix you're saving is actually the camera transformation + a translation of [10, 0, 0]. You need a glLoadIdentity() after you push your modelview matrix.

##### Share on other sites
cheers for your reply, i found that was the problem and quickly ran into another one before i could post back that i had my solution.

theank you anyway :)

1. 1
2. 2
Rutin
20
3. 3
khawk
16
4. 4
A4L
14
5. 5
• ### Forum Statistics

• Total Topics
633755
• Total Posts
3013706
×