beginner620824

03-14-2003, 04:26 AM

Hi all and Ilkka:

I am having a big trouble to find out the world coord of a point which has been done by certain transformations.

I think i am hopeless if i can't get any help from you.

Please and thanks, liuya

below is somwhat of my main loop for render

int DrawGLScene(GLvoid)

{

glClearColor(0.0,0.0,0.0,0.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //

glLoadIdentity();

//below some stuff for the viewer walking around the world, don' care it much*/ float xtrans = -xpos;

float ztrans = -zpos;

float ytrans = -0.25f-ypos;

float sceneroty =360.0f-yrot;

glRotatef(lookupdown,1.0f,0,0);

glRotatef(sceneroty,0,1.0f,0);

glTranslatef(xtrans, ytrans, ztrans);

/*!!!!!!!!!!!!here i call a functoin to draw a cylinder*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/

drawcylinder(0.1,1,1,1,2,2,2);

/*/!!!!!now i want to know the location, in world coord,of those points on the base/top of the cylinder*/

}

//************************************************** ********************************************

void drawcylinder(float r,float x1,float y1,float z1,float x2,float y2,float z2)

{

//r=radius

//x1,y1,z1, the center of the base

//x2,y2,z2, the center of the top

//DTOR=3.1415/180.0f

float len, angleA,angleB;

len=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));

angleA=atan((x2-x1)/(z2-z1));

angleB=asin((y2-y1)/len);

glPushMatrix();

glTranslatef(x1,y1,z1);

glRotatef(angleA/DTOR,0.0f,1.0f,0.0f);

glRotatef(-angleB/DTOR,1,0,0);

glColor3f(0.3,0.0,0.9);

gluCylinder(obj,r,r,len,8,1);

glColor3f(1,1,1);

glBegin(GL_LINES);

//below i make some points on the plane of both base and top and draw a line between them(the base and top)*/

for(int i=0;i<10;i++)

{

float x=0.005*sin(DTOR*36*i);

float y=0.005*cos(DTOR*36*i);

glVertex3d(x,y,0);

glVertex3d(x,y,len);

}

glEnd();

glPopMatrix();

}

//**********************************

There has been some help from Ilkka which can be found in my post "a math probelm, how to find a point". you can see it also as below. I just can't figure out where i should put glGetFloatv(i tried putting it everywhere, the ouptput never made any sense)

and what the XYZ is, are they the world coord of the point (which i want to find) before transformatoin?

quote:

--------------------------------------------------------------------------------

Originally posted by JustHanging:

Ok, maybe I could write it open, assuming you have the modelview matrix (after the rotations) in a glFloat array,

w = x*m[3]+y*m[7]+m[15];

worldx = (x*m[0]+y*m[4]+m[12])/w;

worldy = (x*m[1]+y*m[5]+m[13])/w;

worldz = (x*m[2]+y*m[6]+m[14])/w;

Totally untested. Good luck!

-Ilkka

--------------------------------------------------------------------------------

Hi Ilkka:

Thanks a lot.

this formula seems to be specific to my question since there is no Z. What shall i read if i want to fully understand and handle it myself? now i know there is a lot to learn about opengl. well i will try it first!

I am having a big trouble to find out the world coord of a point which has been done by certain transformations.

I think i am hopeless if i can't get any help from you.

Please and thanks, liuya

below is somwhat of my main loop for render

int DrawGLScene(GLvoid)

{

glClearColor(0.0,0.0,0.0,0.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //

glLoadIdentity();

//below some stuff for the viewer walking around the world, don' care it much*/ float xtrans = -xpos;

float ztrans = -zpos;

float ytrans = -0.25f-ypos;

float sceneroty =360.0f-yrot;

glRotatef(lookupdown,1.0f,0,0);

glRotatef(sceneroty,0,1.0f,0);

glTranslatef(xtrans, ytrans, ztrans);

/*!!!!!!!!!!!!here i call a functoin to draw a cylinder*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/

drawcylinder(0.1,1,1,1,2,2,2);

/*/!!!!!now i want to know the location, in world coord,of those points on the base/top of the cylinder*/

}

//************************************************** ********************************************

void drawcylinder(float r,float x1,float y1,float z1,float x2,float y2,float z2)

{

//r=radius

//x1,y1,z1, the center of the base

//x2,y2,z2, the center of the top

//DTOR=3.1415/180.0f

float len, angleA,angleB;

len=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));

angleA=atan((x2-x1)/(z2-z1));

angleB=asin((y2-y1)/len);

glPushMatrix();

glTranslatef(x1,y1,z1);

glRotatef(angleA/DTOR,0.0f,1.0f,0.0f);

glRotatef(-angleB/DTOR,1,0,0);

glColor3f(0.3,0.0,0.9);

gluCylinder(obj,r,r,len,8,1);

glColor3f(1,1,1);

glBegin(GL_LINES);

//below i make some points on the plane of both base and top and draw a line between them(the base and top)*/

for(int i=0;i<10;i++)

{

float x=0.005*sin(DTOR*36*i);

float y=0.005*cos(DTOR*36*i);

glVertex3d(x,y,0);

glVertex3d(x,y,len);

}

glEnd();

glPopMatrix();

}

//**********************************

There has been some help from Ilkka which can be found in my post "a math probelm, how to find a point". you can see it also as below. I just can't figure out where i should put glGetFloatv(i tried putting it everywhere, the ouptput never made any sense)

and what the XYZ is, are they the world coord of the point (which i want to find) before transformatoin?

quote:

--------------------------------------------------------------------------------

Originally posted by JustHanging:

Ok, maybe I could write it open, assuming you have the modelview matrix (after the rotations) in a glFloat array,

w = x*m[3]+y*m[7]+m[15];

worldx = (x*m[0]+y*m[4]+m[12])/w;

worldy = (x*m[1]+y*m[5]+m[13])/w;

worldz = (x*m[2]+y*m[6]+m[14])/w;

Totally untested. Good luck!

-Ilkka

--------------------------------------------------------------------------------

Hi Ilkka:

Thanks a lot.

this formula seems to be specific to my question since there is no Z. What shall i read if i want to fully understand and handle it myself? now i know there is a lot to learn about opengl. well i will try it first!