C++ 如何在3d中设置左下角的原点
我想在左上角画一个40边的立方体。我的格洛托函数是C++ 如何在3d中设置左下角的原点,c++,opengl,isometric,C++,Opengl,Isometric,我想在左上角画一个40边的立方体。我的格洛托函数是 glOrtho(0, // left 1000, // right 0, // bottom 1000, // top 0, // zNear 1000 // zFar ); x,y,z轴的长度达到1000。所以立方体应该在左下角,尺寸应该和我给出的一样。而gluLookAt()应该是什么;功能。我没有
glOrtho(0, // left
1000, // right
0, // bottom
1000, // top
0, // zNear
1000 // zFar
);
x,y,z轴的长度达到1000。所以立方体应该在左下角,尺寸应该和我给出的一样。而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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义GL_GLEXT_原型
#苹果__
#否则
#恩迪夫
void display();
void specialKeys();
双旋转y=0;
双旋转_x=0;
无效显示(){
//清除屏幕和Z缓冲区
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//重置变换
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_多边形);
GL3F(1.0,0.0,0.0);
glVertex3f(0,0,0);
glVertex3f(40,0,0);
glVertex3f(40,40,0);
glVertex3f(0,40,0);
格伦德();
//侧背
glBegin(GL_多边形);
GL3F(1.0,0.0,1.0);
glVertex3f(0,0,40);
glVertex3f(0,40,40);
glVertex3f(40,40,40);
glVertex3f(40,0,40);
格伦德();
//右侧
glBegin(GL_多边形);
GL3F(0.0,0.0,1.0);
glVertex3f(40,40,0);
glVertex3f(40,0,0);
glVertex3f(40,0,40);
glVertex3f(40,40,40);
格伦德();
//左侧
glBegin(GL_多边形);
GL3F(0.0,1.0,0.0);
glVertex3f(0,0,0);
glVertex3f(0,40,0);
glVertex3f(0,40,40);
glVertex3f(0,0,40);
格伦德();
//侧顶
glBegin(GL_多边形);
GL3F(0.0,0.0,1.0);
glVertex3f(0,40,0);
glVertex3f(0,40,40);
glVertex3f(40,40,40);
glVertex3f(40,40,0);
格伦德();
//侧底
glBegin(GL_多边形);
GL3F(1.0,0.5,0.0);
glVertex3f(0,0,0);
glVertex3f(40,0,0);
glVertex3f(40,0,40);
glVertex3f(0,0,40);
格伦德();
glFlush();
glutSwapBuffers();
}
void init()
{
glClearColor(0.5,0.5,0.0,0.0);
gl3f(1,0,0);
glMatrixMode(GL_投影);
glLoadIdentity();
//gluOrtho2D(-1.0,1.0,-1.0,1.0);
格洛托(0,//左
1000,//对
0,//底部
1000,//顶部
0,//zNear
1001//zFar
);
gluLookAt(0.0,0.0,0.0,0.0,0.0,-1000.0,0.0,1000.0,0.0);
}
无效特殊键(整数键、整数x、整数y){
//右箭头-增加旋转5度
if(key==GLUT\u key\u RIGHT)
旋转y+=5;
//左箭头-减少旋转5度
else if(key==GLUT\u key\u LEFT)
旋转y-=5;
else if(key==GLUT\u key\u UP)
旋转_x+=5;
else if(key==GLUT\u key\u DOWN)
旋转_x-=5;
//请求显示更新
再发现();
}
int main(int argc,char*argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_双精度| GLUT_RGB | GLUT_深度);
glutInitWindowSize(10001000);
位置(10,10);
//创建窗口
glutCreateWindow(“超级立方体”);
//启用Z缓冲区深度测试
glEnable(GLU深度试验);
glutDisplayFunc(显示器);
glutSpecialFunc(specialKeys);
init();
glutMainLoop();
返回0;
}
你把转换搞砸了。在Init()
中,将当前矩阵模式设置为GL\u投影
并加载一些正交矩阵。然后把注视矩阵乘以这个。这在原则上是错误的,因为lookAt矩阵应该应用于GL\u MODELVIEW
堆栈。(您选择的lookAt参数实际上会生成一个标识lookAt矩阵,因此该调用没有效果,但这只是一个旁注)
但是,真正的错误在display()
中。这里有glLoadIdentity()
,它只会用一个单位矩阵覆盖您以前的矩阵,因此您会丢失您设置的正交变换,因为您仍然有GL\u投影
矩阵堆栈处于活动状态
正确的方法是:
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年前的老结。< /P>谢谢。我有加法GLOTHOO(0,/左1000,/右0,/底1000,//上0,/ZONNEXNUL//ZFAR);函数和gluLookAt(0,0,20,0,0,0,01000,0);正如你所解释的。glulookat函数是否正确。你能告诉我gluLookAt()函数应该是什么吗。我想给用户输入,就像我给2d对象输入的一样,它可以工作。但是现在我没有得到渴望的输出,请帮助。为什么要更改lookat参数?在注释中添加新的注释后,您将目光从对象移开。