openGL固定相机?

时间:2015-12-09 11:41:30

标签: c++ opengl 3d

此代码生成多维数据集。代码工作正常。 但是,如果我增加顶点值,它不会显示在显示中。我想要更大的立方体,但更大的立方体不显示在显示器中。我该怎么解决? 谢谢你的回答...

#define A glVertex3f (-0.5,  0.5, -0.5)
#define B glVertex3f (-0.5, -0.5, -0.5)
#define C glVertex3f ( 0.5, -0.5, -0.5)
#define D glVertex3f ( 0.5,  0.5, -0.5)
#define E glVertex3f (-0.5,  0.5,  0.5)
#define F glVertex3f (-0.5, -0.5,  0.5)
#define G glVertex3f ( 0.5, -0.5,  0.5)
#define H glVertex3f ( 0.5,  0.5,  0.5)
#define _USE_MATH_DEFINES
#include <cmath>
#include <stdlib.h>
#include <math.h>
#include <glut.h>

float distance = 5.0;
int longitude = 0, latitude = 0, ainc = 5;
int lastx = -1, lasty = -1;

void display (void)
{
float xc, yc, zc;
int type = GL_POLYGON;   // or GL_LINE_LOOP
xc = distance * cos (latitude /180.0*M_PI) * cos (longitude/180.0*M_PI);
yc = distance * sin (latitude /180.0*M_PI);
zc = distance * cos (latitude /180.0*M_PI) * sin (longitude/180.0*M_PI);
glLoadIdentity ();
gluLookAt (xc, yc, zc,  0.0, 0.0, 0.0,  0.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Sides of the cube as loops or polygons, in anti-clockwise order.
glColor3f (1.0, 0.0, 0.0);
glBegin (type);  A; B; C; D;  glEnd();  // front
glColor3f (0.0, 1.0, 0.0);
glBegin (type);  H; E; F; G;  glEnd();  // back
glColor3f (0.0, 0.0, 1.0);
glBegin (type);  B; C; G; F;  glEnd();  // bottom
glColor3f (1.0, 0.0, 1.0);
glBegin (type);  A; D; H; E;  glEnd();  // top
glColor3f (0.0, 1.0, 1.0);
glBegin (type);  A; E; F; B;  glEnd();  // left
glColor3f (1.0, 1.0, 0.0);
glBegin (type);  D; C; G; H;  glEnd();  // right
glutSwapBuffers ();
}

void keyboard (unsigned char key, int x, int y)
{
switch (key) {
case 27: case 'q': case 'Q':
exit (EXIT_SUCCESS);
break;
}
}

void special (int key, int x, int y)
{
switch (key) {
case GLUT_KEY_UP:
distance *= 1.1;
break;
case GLUT_KEY_DOWN:
distance /= 1.1;
break;
 }
 glutPostRedisplay ();
 }

 void click (int button, int state, int x, int y)
{
 if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
 lastx = x;
 lasty = y;
 }
 }

void mouse (int x, int y)
{
  if (x > lastx) {
longitude = (longitude + ainc) % 360;
 } else if (x < lastx) {
 longitude = (longitude - ainc) % 360;
 }
 if (y > lasty) {
 latitude = (latitude + ainc) % 360;
 } else if (y < lasty) {
 latitude = (latitude - ainc) % 360;
  }
 lastx = x;
 lasty = y;
 glutPostRedisplay ();
 }

 void reshape (int w, int h)
 {
 glViewport (0, 0, (GLsizei) w, (GLsizei) h);
 glMatrixMode (GL_PROJECTION);
 glLoadIdentity ();
 gluPerspective (65.0, (GLfloat) w / (GLfloat) h, 1.0, 20.0);
 glMatrixMode (GL_MODELVIEW);
 glLoadIdentity ();
 glTranslatef (0.0, 0.0, -5.0);
 }


 int main (int argc, char *argv[])
 {
 glutInit (&argc, argv);
 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
 glutCreateWindow (argv[0]);
 glMatrixMode (GL_PROJECTION);
 glLoadIdentity ();
 gluPerspective(50.0, 1.0, 3.0, 7.0);
 glMatrixMode (GL_MODELVIEW);
  glutDisplayFunc (display);
 glutKeyboardFunc (keyboard);
 glutSpecialFunc (special);
 glutMouseFunc (click);
 glutMotionFunc (mouse);
 glutReshapeFunc (reshape);
 glEnable (GL_DEPTH_TEST);
 glutMainLoop ();
 return EXIT_SUCCESS;
 }

2 个答案:

答案 0 :(得分:1)

我怀疑你的观点是否被打破了。 你的近和远飞机是3.0和7.0单位。如果您将点移到这些平面之外,它们将被移除。重塑窗口时也使用1.0和20.0,但除非有重塑事件,否则不会使用它们。

我不知道您为立方体使用的值,但我认为您超出了您定义的范围。尝试增加近处和远处之间的差异,并确保你的立方体落在它们之间。

有关gluPerspective的更多信息,请参阅the documentation

答案 1 :(得分:0)

要缩放对象的顶点,只需将它们乘以相同的数字即可。例如,如果要将立方体设置为两倍大,请将所有顶点乘以glScalef(float x, float y, float z)

如果立方体变得如此之大,以至于它的正面落在了#34;相机的后面。然后它将不会渲染,如果你的设置没有呈现&#34;背面&#34;面部,然后你的立方体根本不会渲染(因为相机将在其中)。

您也可以使用firstTime