OpenGL通过基本图形绘制桌、椅、床等——VS2022

计算机图形学想要绘制三维的桌椅以及床,或者是其他的物体,都是非常简单的。

例如在我们的现实中,如果想要用木头制作简单的桌子,我们怎么办呢?

很简单,不就是长方体的四个脚,一个正方形的桌面,或者是圆形桌面。再把这些东西组合连接在一起,这就得到了一个简单的桌子了。

在我们的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中调用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值