计算机图形学之宇宙牌轿车

本文介绍了作者在学习计算机图形学时,结合轿车和太阳系程序创作的宇宙牌轿车项目。在实现过程中遇到太阳闪烁的问题,可能是由于性能限制。代码已分享,需要glut库支持,使用C++语言在Visual Studio 2017环境下编译。期待社区的优化建议。

前言

最近在学计算机图形学时,基于之前自己完成的轿车以及太阳系两个程序,老师布置了个新作业——将这两个结合起来,画一台宇宙牌轿车!我兴致勃勃地写了一上午,最后好不容易完成了。有一点小bug——太阳一直闪。这可能是车和太阳同时display时电脑性能不够导致的。如果各位同袍们有改进的想法欢迎评论区留言。现把代码发布如下,希望能给各位同袍们一点帮助。

注意复制代码不可直接运行。需要glut等库。可在官网自行下载配置。

编译环境: Visual Studio 2017,语言:C++

MyCar

#include<stdio.h>
#include<stdlib.h>
#include<cmath>
#include<math.h>
#include <windows.h>
#include "glut.h"

#define BLACK 0, 0, 0
#define LIGHT_GREEN 0.125, 0.698, 0.667
#define DARK_GREEN 0.000, 0.502, 0.502
#define LIGHT_RED 0.647, 0.165, 0.165
#define DARK_RED 0.502, 0.000, 0.000
#define LIGHT_WHITE 0.961, 0.961, 0.961
#define DARK_WHITE 0.502, 0.502, 0.502
#define DEEP_DARK_WHITE 0.412, 0.412, 0.412
#define START_RILL 45
#define RILL_DELTA 2
#define DEVIDER_LEN 25
#define START_LAMP -200
#define LAMP_DELTA 2
#define END_LAMP -400
#define LAMP_INTERVAL 200
#define START_ANGLE 4
#define END_ANGLE 5.5
#define MAX_CAMERA_HEIGHT 100
#define MIN_CAMERA_HEIGHT 10
#define CAR_POSITION_MIN -18
#define CAR_POSITION_DELTA 0.2
#define CAR_POSITION_MAX 38
#define LAMP_COLOR 0.184, 0.310, 0.310
#define LIGHT_COLOR 0.914, 0.588, 0.478
#define DELTA 0.001
#define SKY_TOP 1.000, 1.000, 1.000

using namespace std;
bool bPersp = false;
bool bWire = false;
int year = 0, day = 0, marsYear = 0;
int speed = 12;
int wHeight = 0;
int wWidth = 0;
int state = 1;
float eye[] = {
   
    5.5, 1.7, 1.7 };
float center[] = {
   
    0, 0, 0 };
GLUquadricObj *g_g;

double cameraAngle;
double cameraAngleDelta;
double cameraHeight;
double cameraHeightDelta = 0.05;
double cameraRadius;
double rectAngle;
double lamp_start;
double car_position;
bool canDrawGrid;
bool camera_angle_inc;
bool camera_height_inc;
bool move_enable;
double car_move = START_RILL;
GLUquadric *qobj;


void car_top(double x, double y) {
   
   

	glBegin(GL_QUADS); {
   
   
		glColor3f(LIGHT_GREEN);
		glVertex3f(x - 7.5, 0, 30);
		glVertex3f(x + 7.5, 0, 30);
		glColor3f(DARK_GREEN);
		glVertex3f(x + 7.5, 30, 30);
		glVertex3f(x - 7.5, 30, 30);
	}glEnd();

	glBegin(GL_QUADS); {
   
   
		glColor3f(LIGHT_GREEN);
		glVertex3f(x - 7.5, 30, 30);
		glVertex3f(x + 7.5, 30, 30);
		glVertex3f(x + 7.5, 32, 28);
		glVertex3f(x - 7.5, 32, 28);
	}glEnd();

	glBegin(GL_QUADS); {
   
   
		glColor3f(LIGHT_GREEN);
		glVertex3f(x - 7.5, 0, 30);
		glVertex3f(x - 7.5, -3, 27);

		glColor3f(DARK_GREEN);
		glVertex3f(x, -3, 27);
		glVertex3f(x, 0, 30);
	}glEnd();

	glBegin(GL_QUADS); {
   
   
		glColor3f(LIGHT_GREEN);
		glVertex3f(x + 7.5, -3, 27);
		glVertex3f(x + 7.5, 0, 30);

		glColor3f(DARK_GREEN);
		glVertex3f(x, 0, 30);
		glVertex3f(x, -3, 27);

	}glEnd();
}

void front_n_back_glass(double x, double y) {
   
   

	glBegin(GL_QUADS); {
   
   
		glColor3f(DARK_WHITE);
		glVertex3f(x - 7.5, 32, 28);
		glVertex3f(x + 7.5, 32, 28);
		glColor3f(LIGHT_WHITE);
		glVertex3f(x + 11.5, 40, 20);
		glVertex3f(x - 11.5, 40, 20);
	}glEnd();

	glBegin(GL_QUADS); {
   
   
		glColor3f(DARK_WHITE);
		glVertex3f(x - 7.5, -3, 27);
		glVertex3f(x + 7.5, -3, 27);
		glColor3f(LIGHT_WHITE);
		glVertex3f(x + 10.5, -9, 20);
		glVertex3f(x - 10.5, -9, 20);
	}glEnd();
}

void top_left_frame(double x, double y) {
   
   
	glBegin(GL_POLYGON); {
   
   
		glColor3f(LIGHT_GREEN);
		glVertex3f(x - 11.5, 40, 20);
		glVertex3f(x - 7.5, 32, 28);
		glVertex3f(x - 7.5, 30, 30);
		glColor3f(DARK_GREEN);
		glVertex3f(x - 8, 30, 28);
		glVertex3f(x - 13.5, 40, 20);
	}glEnd();

	glBegin(GL_POLYGON); {
   
   
		glColor3f(LIGHT_GREEN);

		glVertex3f(x - 7.5, 30, 30);
		glVertex3f(x - 7.5, 0, 30);

		glColor3f(DARK_GREEN);
		glVertex3f(x - 7, 0, 28);
		glVertex3f(x - 7, 30, 28);
	}glEnd();

	glBegin(GL_POLYGON); {
   
   
		glColor3f(LIGHT_GREEN);
		glVertex3f(x - 7.5, 0, 30);
		glVertex3f(x - 7.5, -3, 27);
		glVertex3f(x - 10.5, -9, 20);

		glColor3f(DARK_GREEN);
		glVertex3f(x - 13.5, -9, 20);
		glVertex3f(x - 7, 0, 28);
		glVertex3f(x - 7.5, 0, 30);

	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值