繁体   English   中英

openGL固定相机?

[英]openGL fixing camera?

此代码使多维数据集。 代码正常工作。 但是,如果增加顶点值,则它不会显示在显示屏中。 我想要更大的立方体,但更大的立方体没有显示在显示屏上。 我该如何解决? 感谢您的回答...

#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;
 }

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

我不知道您为多维数据集使用什么值,但我认为您超出了定义的范围。 尝试增加远处和远处之间的距离,并确保您的立方体落在它们之间。

有关gluPerspective更多信息,请参阅文档

要缩放对象的顶点,只需要将它们乘以相同的数字即可。 例如,如果要制作两倍大的立方体,请将所有顶点乘以2.0

如果多维数据集太大,以至于其正面在“相机”后面,那么它将无法渲染,并且如果您的设置未渲染面的“背面”,则您的立方体将根本不会渲染(因为相机会在里面)。

您也可以使用glScalef(float x, float y, float z)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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