在 OpenGL 中设置 3D space 的尺寸
Setting dimensions of 3D space in OpenGL
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <freeglut.h>
#include <FreeImage.h>
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
double aspect = (double)viewport[2] / (double)viewport[3];
gluPerspective(60, aspect, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-35);
static float angle = 0;
angle += 4.0f;
//magenta middle cube
glPushMatrix();
glTranslatef(0, 0, 0);
glRotatef(angle, 0.1, 0.2, 0.5);
glColor3ub(224,8,133);
glutSolidCube(5);
glPopMatrix();
//yellow right cube
glPushMatrix();
glTranslatef(10, 5, 0);
glRotatef(angle, 0.2, 0.3, 0.1);
glColor3ub(250, 224, 20);
glutSolidCube(5);
glPopMatrix();
//cyan left cube
glPushMatrix();
glTranslatef(-10, -5, 0);
glRotatef(angle, 0.3, 0.2, 0.6);
glColor3ub(0, 162, 211);
glutSolidCube(5);
glPopMatrix();
glFlush();
glutSwapBuffers();
}
void repeat(int val) {
glutPostRedisplay();
glutTimerFunc(10, repeat, 0);
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("SIMPLE DISPLAY");
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-500,500,-500,500,-500,500);
glutDisplayFunc(display);
glutTimerFunc(0, repeat, 0);
glutMainLoop();
return 0;
}
我有代码在 3-space 中绘制三个立方体并旋转它们。我注意到尽管使用 glOrtho(-500,500,-500,500,-500,500)
,但工作区域非常小。在三个方向上平移立方体使得工作区域看起来只有 50x50x50(在 z 维度上不确定,因为它会在消失之前返回 50,但无法确认前面的距离)。将立方体 25 向左或向右平移会使它超出 window 边界。
我想 glOrtho()
设置工作区大小,在本例中为 1000x1000x1000?
您正在通过 gluPerspective
调用覆盖显示函数开头的 glOrtho
调用。您只能应用一种投影,透视投影或正交投影。
glOrtho
定义的不是屏幕的大小,而是一个正交投影矩阵(只要不移动相机,也可以看成是工作区的大小)。
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <freeglut.h>
#include <FreeImage.h>
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
double aspect = (double)viewport[2] / (double)viewport[3];
gluPerspective(60, aspect, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-35);
static float angle = 0;
angle += 4.0f;
//magenta middle cube
glPushMatrix();
glTranslatef(0, 0, 0);
glRotatef(angle, 0.1, 0.2, 0.5);
glColor3ub(224,8,133);
glutSolidCube(5);
glPopMatrix();
//yellow right cube
glPushMatrix();
glTranslatef(10, 5, 0);
glRotatef(angle, 0.2, 0.3, 0.1);
glColor3ub(250, 224, 20);
glutSolidCube(5);
glPopMatrix();
//cyan left cube
glPushMatrix();
glTranslatef(-10, -5, 0);
glRotatef(angle, 0.3, 0.2, 0.6);
glColor3ub(0, 162, 211);
glutSolidCube(5);
glPopMatrix();
glFlush();
glutSwapBuffers();
}
void repeat(int val) {
glutPostRedisplay();
glutTimerFunc(10, repeat, 0);
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("SIMPLE DISPLAY");
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-500,500,-500,500,-500,500);
glutDisplayFunc(display);
glutTimerFunc(0, repeat, 0);
glutMainLoop();
return 0;
}
我有代码在 3-space 中绘制三个立方体并旋转它们。我注意到尽管使用 glOrtho(-500,500,-500,500,-500,500)
,但工作区域非常小。在三个方向上平移立方体使得工作区域看起来只有 50x50x50(在 z 维度上不确定,因为它会在消失之前返回 50,但无法确认前面的距离)。将立方体 25 向左或向右平移会使它超出 window 边界。
我想 glOrtho()
设置工作区大小,在本例中为 1000x1000x1000?
您正在通过 gluPerspective
调用覆盖显示函数开头的 glOrtho
调用。您只能应用一种投影,透视投影或正交投影。
glOrtho
定义的不是屏幕的大小,而是一个正交投影矩阵(只要不移动相机,也可以看成是工作区的大小)。