C++ OpenGL坐标是什么?忽略OpenGL窗口大小
我刚开始尝试简单的“绘制立方体”。在最终战胜OpenGL后,我仍然有非常细微的结果。我的问题是对象倾向于调整自身大小以匹配窗口大小。相反,我希望窗口大小决定渲染区域-窗口越大,您看到的越多 以下是一些调整大小的屏幕截图:C++ OpenGL坐标是什么?忽略OpenGL窗口大小,c++,opengl,freeglut,obsolete,C++,Opengl,Freeglut,Obsolete,我刚开始尝试简单的“绘制立方体”。在最终战胜OpenGL后,我仍然有非常细微的结果。我的问题是对象倾向于调整自身大小以匹配窗口大小。相反,我希望窗口大小决定渲染区域-窗口越大,您看到的越多 以下是一些调整大小的屏幕截图: 有意将图片保留为链接 这种自动调整大小的行为带来了一个问题:OpenGL中使用的坐标是什么。首先要记住的是:OpenGL是一个绘图API。它不能维持一个场景或类似的东西 所以OpenGL所做的是,它以顶点属性的形式将几何输入坐标映射到屏幕空间。在旧的固定函数中有一个特殊的顶
有意将图片保留为链接
这种自动调整大小的行为带来了一个问题:OpenGL中使用的坐标是什么。首先要记住的是:OpenGL是一个绘图API。它不能维持一个场景或类似的东西 所以OpenGL所做的是,它以顶点属性的形式将几何输入坐标映射到屏幕空间。在旧的固定函数中有一个特殊的顶点属性,称为“顶点位置”或简称“顶点”(实际顶点不仅仅是位置) 通过三个步骤将位置转换为通常称为“屏幕”空间(但取决于视口的放置位置,它也可以称为“窗口”或“视口”)空间: 1.转换到视图/眼睛空间:这是通过将顶点位置与modelview矩阵相乘来完成的 某些进一步的计算(如照明计算)在视图空间中进行 2.剪辑空间变换:视图空间位置变换为剪辑空间。这通常称为投影,描述此变换的矩阵称为投影矩阵 在剪辑空间中会发生一些特殊的事情,概括为剪辑,您还不必担心 3.在最后一步中,将剪裁几何体转换为标准化设备坐标(NDC)。NDC空间实际上是朝向视口的1:1映射,即NDC体积的限制直接对应于使用glViewport设置的视口的偏移和尺寸 您无法更改第三步的执行方式,第一步是保留用于将内容转换为视图空间的。因此,任何调整都必须在第二步中进行 因此,您必须做的是:投影限制必须与视口范围成正比
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-width/2, width/2, -height/2, height/2, -1, 1);
哦,还有一个一般性的注意事项:您也应该始终在绘图功能中设置视口和投影设置。如果您看到教程将这些语句放在窗口大小调整处理程序中,请忽略它,在绘图代码中执行它。从长远来看,这确实简化了事情。首先要记住的是:OpenGL是一个绘图API。它不维护场景或类似的东西 所以OpenGL所做的是,它以顶点属性的形式将几何输入坐标映射到屏幕空间。在旧的固定函数中,有一个特殊的顶点属性称为“顶点位置”或简称“顶点”(实际顶点不仅仅是位置) 通过三个步骤将位置转换为通常称为“屏幕”空间(但取决于视口的放置位置,它也可以称为“窗口”或“视口”)空间: 一,。转换到视图/眼睛空间:这是通过将顶点位置与modelview矩阵相乘来完成的 某些进一步的计算(如照明计算)在视图空间中进行 二,。变换到剪辑空间:视图空间位置变换到剪辑空间。这通常被称为投影,恰当地说,描述这种变换的矩阵被称为投影矩阵 在剪辑空间中会发生一些特殊的事情,概括为剪辑,您还不必担心 三,。在最后一步中,将剪裁的几何体转换为标准化设备坐标(NDC)。NDC空间实际上是朝向视口的1:1映射,即NDC体积的限制直接对应于使用glViewport设置的视口的偏移和尺寸 您无法更改第三步的执行方式,第一步保留用于将内容转换为视图空间。因此,任何调整都必须在第二步中进行 因此,您必须执行以下操作:投影限制必须与视口范围成正比。比如像这样
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-width/2, width/2, -height/2, height/2, -1, 1);
哦,还有一点需要注意:您也应该在绘图功能中设置视口和投影设置。如果您看到一个教程将这些语句放在窗口调整大小处理程序中,请忽略它并在图形代码中执行。从长远来看,这确实简化了事情。有趣的是:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH ) / 300.0;
double h = glutGet( GLUT_WINDOW_HEIGHT ) / 300.0;
glOrtho( -1 * w, 1 * w, -1 * h, 1 * h, 10, -10);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
在这方面:
#include <GL/glut.h>
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);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH ) / 300.0;
double h = glutGet( GLUT_WINDOW_HEIGHT ) / 300.0;
glOrtho( -1 * w, 1 * w, -1 * h, 1 * h, 10, -10);
glMatrixMode( GL_MODELVIEW );
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 );
//Multi-colored side - FRONT
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.5, -0.5, -0.5 ); // P1 is red
glColor3f( 0.0, 1.0, 0.0 ); glVertex3f( 0.5, 0.5, -0.5 ); // P2 is green
glColor3f( 0.0, 0.0, 1.0 ); glVertex3f( -0.5, 0.5, -0.5 ); // P3 is blue
glColor3f( 1.0, 0.0, 1.0 ); glVertex3f( -0.5, -0.5, -0.5 ); // P4 is purple
glEnd();
// White side - BACK
glBegin(GL_POLYGON);
glColor3f( 1.0, 1.0, 1.0 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glEnd();
// Purple side - RIGHT
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 1.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glEnd();
// Green side - LEFT
glBegin(GL_POLYGON);
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();
// Blue side - TOP
glBegin(GL_POLYGON);
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glEnd();
// Red side - BOTTOM
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 0.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();
glFlush();
glutSwapBuffers();
}
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[]){
// Initialize GLUT and process user parameters
glutInit(&argc,argv);
// Request double buffered true color window with Z-buffer
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
// Create window
glutCreateWindow("Awesome Cube");
// Enable Z-buffer depth test
glEnable(GL_DEPTH_TEST);
// Callback functions
glutDisplayFunc(display);
glutSpecialFunc(specialKeys);
// Pass control to GLUT for events
glutMainLoop();
// Return to OS
return 0;
}
#包括
void display();
void specialKeys();
双旋转y=0;
双旋转_x=0;
无效显示(){
//清除屏幕和Z缓冲区
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
双w=glutGet(GLUT\U窗口\U宽度)/300.0;
双h=glutGet(GLUT\U窗高度)/300.0;
格洛托(-1*w,1*w,-1*h,1*h,10,-10);
glMatrixMode(GLU模型视图);
glLoadIdentity();
//当用户更改Rotate_x和Rotate_y时进行旋转
glRotatef(rotate_x,1.0,0.0,0.0);
glRotatef(rotate_y,0.0,1.0,0.0);
//多色侧前
glBegin(GL_多边形);
glColor3f(1.0,0.0,0.0);glVertex3f(0.5,-0.5,-0.5);//P1为红色
glColor3f(0.0,1.0,0.0);glVertex3f(0.5,0.5,-0.5);//P2为绿色
glColor3f(0.0,0.0,1.0);glVertex3f(-0.5,0.5,-0.5);//P3为蓝色
glColor3f(1.0,0.0,1.0);glVertex3f(-0.5,-0.5,-0.5);//P4为紫色
格伦德();
//白色侧背
glBegin(GL_多边形);
GL3F(1.0,1.0,1.0);
glVertex3f(0.5,-0.5,0.5);
glVertex3f(0.5,0.5,0.5);
glVertex3f(-0.5,0.5,0.5);
glVertex3f(-0.5,-0.5,0.5);
格伦德();
//紫色边-右侧
glBegin(GL_多边形);
GL3F(1.0,0.0,1.0);
glVertex3