计算机图形学想要绘制三维的桌椅以及床,或者是其他的物体,都是非常简单的。
例如在我们的现实中,如果想要用木头制作简单的桌子,我们怎么办呢?
很简单,不就是长方体的四个脚,一个正方形的桌面,或者是圆形桌面。再把这些东西组合连接在一起,这就得到了一个简单的桌子了。
在我们的OpenGL中有这样几条代码,只需要这简单的几条,组合起来,就可以绘制出我们想要的组合物体(桌、椅、床等等)啦。
glutSolidCube(1);
这个函数是绘制一个立方体
glScalef(8, 8, 1);
这个函数是指物体xyz轴上的比例。通俗的,我们可以理解为我所想要绘制物体的长宽高。
glTranslatef(0, 0, 0);
这个函数是物体在我们所建立的三位坐标系下的坐标,如上代码,我们物体在坐标系中的坐标为(0,0,0),x=0且y=0且z=0的位置处。
就根据以上三条代码,获得不同长宽高的立方体,组合成想要的桌子了。
glPushMatrix();
glTranslatef(0, 0, 0);
glScalef(8, 1, 8);
glutSolidCube(1);
glPopMatrix();
如上代码的意思是:绘制一个x方向长8,y方向长1,z方向长8,在坐标系中(0,0,0)位置处的立方体。
首先我们画一个长8,宽8,高1的立方体,来做我们的桌面。
如图这就是绘制出来的立方体
这可能看不出来是个三维图形,那我把它转一定角度。
现在能看出来它是立方体了吧
接下来我们再画桌脚,四个桌角都是长1,宽1,高6的立方体,四个脚分别放在桌面下放四个角处。
在旋转一定的角度之后,看得出他是一个三位图形。
接下来将这些东西,通过变换坐标位置,将它们组合在一起。
这样,一个简单的桌子就绘制出来了。
桌子的代码:
void drawDesk()
{
glColor3f(0.87, 0.72, 0.52);//桌子颜色
//桌面
glPushMatrix();
glTranslatef(0, 0, 0);
glScalef(8, 1, 8);
glutSolidCube(1);
glPopMatrix();
//四个桌脚
glPushMatrix();
glTranslatef(-3, -3, -3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(3, -3, 3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(3, -3, -3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-3, -3, 3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
}
接下来绘制椅子,同理。
因为担心看不出来椅子,所以我旋转了一丢丢角度。
void drawChair()
{
glColor3f(0.87, 0.72, 0.52);
glPushMatrix();
glTranslatef(0, 0, 0);
glScalef(8, 1, 8);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(0, 4, -3);
glScalef(8, 8, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-3, 0, -3);
glScalef(1, 12, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(3, -3, 3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(3, 0, -3);
glScalef(1, 12, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-3, -3, 3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
}
接下来,我们画床
依旧是我旋转了一定角度,让大家能看得出来这是个什么。
void drawBed()
{
glColor3f(0.87, 0.72, 0.52);
glPushMatrix();
glTranslatef(0, 0, -14);
glScalef(8, 8, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(0, -2.5, 0);
glScalef(8, 4, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(0, -1, -7);
glScalef(8, 1, 14);
glutSolidCube(1);
glPopMatrix();
glColor3f(1, 0.75, 0.79);
glPushMatrix();
glTranslatef(0, 0, -6.5);
glScalef(8, 1, 14);
glutSolidCube(1);
glPopMatrix();
}
不知道我讲的是否清楚呢,欢迎大家提意见,有什么问题也可以评论区提出,我有时间一定回复。
完整代码如下
#include <Windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include<iostream>
#include <math.h>
using namespace std;
void drawDesk()
{
glColor3f(0.87, 0.72, 0.52);
//桌面
glPushMatrix();
glTranslatef(0, 0, 0);
glScalef(8, 1, 8);
glutSolidCube(1);
glPopMatrix();
//四个桌脚
glPushMatrix();
glTranslatef(-3, -3, -3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(3, -3, 3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(3, -3, -3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-3, -3, 3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
}
void drawChair()
{
glColor3f(0.87, 0.72, 0.52);
//椅子面
glPushMatrix();
glTranslatef(0, 0, 0);
glScalef(8, 1, 8);
glutSolidCube(1);
glPopMatrix();
//靠背
glPushMatrix();
glTranslatef(0, 4, -3);
glScalef(8, 8, 1);
glutSolidCube(1);
glPopMatrix();
//后左椅子脚
glPushMatrix();
glTranslatef(-3, 0, -3);
glScalef(1, 12, 1);
glutSolidCube(1);
glPopMatrix();
//前右椅子脚
glPushMatrix();
glTranslatef(3, -3, 3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
//后右椅子脚
glPushMatrix();
glTranslatef(3, 0, -3);
glScalef(1, 12, 1);
glutSolidCube(1);
glPopMatrix();
//前左椅子脚
glPushMatrix();
glTranslatef(-3, -3, 3);
glScalef(1, 6, 1);
glutSolidCube(1);
glPopMatrix();
}
void drawBed()
{
glColor3f(0.87, 0.72, 0.52);
//床头
glPushMatrix();
glTranslatef(0, 0, -14);
glScalef(8, 8, 1);
glutSolidCube(1);
glPopMatrix();
//床尾
glPushMatrix();
glTranslatef(0, -2.5, 0);
glScalef(8, 4, 1);
glutSolidCube(1);
glPopMatrix();
//床板
glPushMatrix();
glTranslatef(0, -1, -7);
glScalef(8, 1, 14);
glutSolidCube(1);
glPopMatrix();
//床垫
glColor3f(1, 0.75, 0.79);
glPushMatrix();
glTranslatef(0, 0, -6.5);
glScalef(8, 1, 14);
glutSolidCube(1);
glPopMatrix();
}
void display(void)
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//drawDesk();
//drawChair();
drawBed();
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(65, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
gluLookAt(0.0, 5.0, 15.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//在哪个角度看物体
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(600, 600);//窗口大小
glutInitWindowPosition(100, 100);//窗口位置
glutCreateWindow("绘制简单的桌、椅、床");//窗口名
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
如果想要多方位展示物体,只需在上述代码中添加上交互的代码。
鼠标交互,键盘交互。别忘了在main中调用。