我想在赃物左上角绘制一个侧面40的立方体。我的glortho功能是

 glOrtho(0,      // left
        1000,  // right
        0, // bottom
        1000,      // top
        0,      // zNear
        1000       // zFar
        );

并且x,y,z轴的长度最大为1000。因此,多维数据集应位于左下角,尺寸应与i给定。以及gluLookAt()应该是什么?功能。我没有得到正确的输出。如果代码中有任何错误,请更正它,并在代码中添加什么功能。
#include <gl/glut.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <stdio.h>
#include <stdarg.h>
#include <math.h>
#define GL_GLEXT_PROTOTYPES
#ifdef __APPLE__
#else
#endif


void display();
void specialKeys();


double rotate_y=0;
double rotate_x=0;


void display(){

//  Clear screen and Z-buffer
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

// Reset transformations
 glLoadIdentity();

 // Rotate when user changes rotate_x and rotate_y
  glRotatef( rotate_x, 1.0, 0.0, 0.0 );
  glRotatef( rotate_y, 0.0, 1.0, 0.0 );



  // side - FRONT
  glBegin(GL_POLYGON);

  glColor3f( 1.0, 0.0, 0.0 );
  glVertex3f(  0, 0, 0);
  glVertex3f( 40,0,0);
  glVertex3f(40,40,0  );
  glVertex3f(0,40,0 );

  glEnd();

  //  side - BACK
  glBegin(GL_POLYGON);
  glColor3f(   1.0,0.0,1.0 );
  glVertex3f(  0,0,40 );
  glVertex3f(  0,40,40);
  glVertex3f( 40,40,40 );
  glVertex3f( 40,0,40 );
  glEnd();

  //  side - RIGHT
  glBegin(GL_POLYGON);
  glColor3f(  0.0,  0.0,  1.0 );
  glVertex3f( 40,40,0 );
  glVertex3f( 40,0,0 );
  glVertex3f( 40,0,40 );
  glVertex3f( 40,40,40 );
  glEnd();

  //  side - LEFT
  glBegin(GL_POLYGON);
  glColor3f(   0.0,  1.0,  0.0 );
  glVertex3f( 0,0,0 );
  glVertex3f( 0,40,0 );
  glVertex3f( 0,40,40 );
  glVertex3f( 0,0,40 );
  glEnd();

  //  side - TOP
  glBegin(GL_POLYGON);
  glColor3f(  0.0,0.0,1.0 );
  glVertex3f(  0,40,0);
  glVertex3f( 0,40,40 );
  glVertex3f( 40,40,40 );
  glVertex3f( 40,40,0 );
  glEnd();

  //  side - BOTTOM
  glBegin(GL_POLYGON);
  glColor3f(  1.0,  0.5,  0.0 );
  glVertex3f( 0,0,0 );
  glVertex3f(  40,0,0 );
  glVertex3f( 40,0,40 );
  glVertex3f( 0,0,40);
  glEnd();

  glFlush();
  glutSwapBuffers();

}
 void init()
{
    glClearColor(0.5,0.5,0.0, 0.0);
    glColor3f(1,0,0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //gluOrtho2D(-1.0,1.0,-1.0,1.0);
    glOrtho(0,      // left
        1000,  // right
        0, // bottom
        1000,      // top
        0,      // zNear
        1001       // zFar
        );
        gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, -1000.0, 0.0, 1000.0, 0.0);
}

void specialKeys( int key, int x, int y ) {

  //  Right arrow - increase rotation by 5 degree
  if (key == GLUT_KEY_RIGHT)
    rotate_y += 5;

  //  Left arrow - decrease rotation by 5 degree
  else if (key == GLUT_KEY_LEFT)
    rotate_y -= 5;

  else if (key == GLUT_KEY_UP)
    rotate_x += 5;

  else if (key == GLUT_KEY_DOWN)
    rotate_x -= 5;

  //  Request display update
  glutPostRedisplay();

}


  int main(int argc, char* argv[]){

  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(1000, 1000);
  glutInitWindowPosition(10, 10);
  // Create window
  glutCreateWindow("Awesome Cube");

  //  Enable Z-buffer depth test
  glEnable(GL_DEPTH_TEST);

  glutDisplayFunc(display);
  glutSpecialFunc(specialKeys);
  init();
  glutMainLoop();
  return 0;
}

最佳答案

您搞砸了转换。在Init()中,将当前矩阵模式设置为GL_PROJECTION并加载一些正交矩阵。然后,将lookAt矩阵与此相乘。原则上这是错误的,因为应将lookAt矩阵应用于GL_MODELVIEW堆栈。 (您选择的lookAt参数实际上会生成一个身份lookAt矩阵,因此该调用无效,但这仅是一个附带说明)。

但是,真正的错误是在display()中。那里有glLoadIdentity(),它只会用一个单位矩阵覆盖以前的矩阵,因此您将失去设置的正交变换,因为您仍然有GL_PROJECTION矩阵堆栈处于 Activity 状态。

正确的方法如下:

void init()
{
    // ... your other stuff
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho( /* your ortho params */ );
    glMatrixMode(GL_MODELVIEW); // switch back to the modelView matrix stack
}

void display()
{
    glLoadIdentity();
    gluLookAt( /* your Lookat parameters */ );
    glRotate/Scale/Translate(...); // your local transformations
    // ...
}

请注意,所有这些东西均已完全弃用,并已从现代OpenGL版本的核心配置文件中删除。如今,在学习OpenGL时,您应该考虑不学习20年前的旧知识。

关于c++ - 如何在3D中将左下角设置为原点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28985242/

10-12 02:02