简体   繁体   中英

How to draw cube at some world coordinates, OpenGL

I have this code that doing this, but it don't work at all!

GLdouble *posv = Utils::worldToScreen(px, py, pz);
GLdouble x = posv[0];
GLdouble y = posv[1];
GLdouble z = posv[2];
GLdouble *sizev = Utils::worldToScreen(1.0f, 1.0f, 1.0f);
GLdouble sizex = sizev[0];
GLdouble sizey = sizev[1];
GLdouble sizez = sizev[2];

glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 0.0);
// FRONT
glVertex3f(x-sizex, y-sizey, z+sizez);
glVertex3f(x+sizex, y-sizey, z+sizez);
glVertex3f(x+sizex, y+sizey, z+sizez);
glVertex3f(x-sizex, y+sizey, z+sizez);
// BACK
glVertex3f(x-sizex, y-sizey, z-sizez);
glVertex3f(x-sizex, y+sizey, z-sizez);
glVertex3f(x+sizex, y+sizey, z-sizez);
glVertex3f(x+sizex, y-sizey, z-sizez);

glColor3f(0.0, 1.0, 0.0);
// LEFT
glVertex3f(x-sizex, y-sizey, z+sizez);
glVertex3f(x-sizex, y+sizey, z+sizez);
glVertex3f(x-sizex, y+sizey, z-sizez);
glVertex3f(x-sizex, y-sizey, z-sizez);
// RIGHT
glVertex3f(x+sizex, y-sizey, z-sizez);
glVertex3f(x+sizex, y+sizey, z-sizez);
glVertex3f(x+sizex, y+sizey, z+sizez);
glVertex3f(x+sizex, y-sizey, z+sizez);

glColor3f(0.0, 0.0, 1.0);
// TOP
glVertex3f(x-sizex, y+sizey, z+sizez);
glVertex3f(x+sizex, y+sizey, z+sizez);
glVertex3f(x+sizex, y+sizey, z-sizez);
glVertex3f(x-sizex, y+sizey, z-sizez);
// BOTTOM
glVertex3f(x-sizex, y-sizey, z+sizez);
glVertex3f(x-sizex, y-sizey, z-sizez);
glVertex3f(x+sizex, y-sizey, z-sizez);
glVertex3f(x+sizex, y-sizey, z+sizez);


GLdouble* Utils::worldToScreen(float objX, float objY, float objZ)  {

GLint realy;
GLdouble win_x, win_y, win_z;
int viewport[4];
double mvmatrix[16], projmatrix[16];

glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);


gluProject(static_cast<GLdouble>(objX), static_cast<GLdouble>(objY), static_cast<GLdouble>(objZ), mvmatrix, projmatrix, viewport, &win_x, &win_y, &win_z);

realy = viewport[3]-(GLint)win_y -1;

GLdouble *temp = new GLdouble[3];
temp[0] = win_x;
temp[1] = realy;
temp[2] = win_z;

cout << "objX:" << objX << endl;
cout << "objY:" << objY << endl;
cout << "objZ:" << objZ << endl;
cout << "temp[0]:" << temp[0] << endl;
cout << "temp[1]:" << temp[1] << endl;
cout << "temp[2]:" << temp[2] << endl;

return temp; }

Output is very strange!

objX:100
objY:100
objZ:0
temp[0]:6.95322e-310
temp[1]:-1
temp[2]:6.95322e-310

What's wrong? Sorry for my stupidity!

Rather than drawing vertices at x+/-size, y+/-size, z+/-size, why don't you just translate to x, y, z with glTranslatef() and then do your drawing?

Try this as your draw function:

void drawCube(float x, float y, float z)
{
    const float sizex = 0.5f;
    const float sizey = 0.5f;
    const float sizez = 0.5f

    glTranslatef(-x, -y, -z);

    glBegin(GL_QUADS);

    glColor3f(1.0, 1.0, 0.0);

    // FRONT
    glVertex3f(-sizex, -sizey, sizez);
    glVertex3f(sizex, -sizey, sizez);
    glVertex3f(sizex, sizey, sizez);
    glVertex3f(-sizex, sizey, sizez);

    // BACK
    glVertex3f(-sizex, -sizey, -sizez);
    glVertex3f(-sizex, sizey, -sizez);
    glVertex3f(sizex, sizey, -sizez);
    glVertex3f(sizex, -sizey, -sizez);

    glColor3f(0.0, 1.0, 0.0);

    // LEFT
    glVertex3f(-sizex, -sizey, sizez);
    glVertex3f(-sizex, sizey, sizez);
    glVertex3f(-sizex, sizey, -sizez);
    glVertex3f(-sizex, -sizey, -sizez);

    // RIGHT
    glVertex3f(sizex, -sizey, -sizez);
    glVertex3f(sizex, sizey, -sizez);
    glVertex3f(sizex, sizey, sizez);
    glVertex3f(sizex, -sizey, sizez);

    glColor3f(0.0, 0.0, 1.0);

    // TOP
    glVertex3f(-sizex, sizey, sizez);
    glVertex3f(sizex, sizey, sizez);
    glVertex3f(sizex, sizey, -sizez);
    glVertex3f(-sizex, sizey, -sizez);

    // BOTTOM
    glVertex3f(-sizex, -sizey, sizez);
    glVertex3f(-sizex, -sizey, -sizez);
    glVertex3f(sizex, -sizey, -sizez);
    glVertex3f(sizex, -sizey, sizez);

    glEnd();

    glTranslatef(x, y, z);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM