OpenGL三维模型+常见错误

项目文件资源链接//download.csdn.net/download/H200102/12101806

一、OpenGL导入三维模型

1.期末的图形学作业要做三维机器人,要求:可以转换视角;光照;机器人可以移动(局部运动);
2.查看资料后发现,发现大部分都是采用画出机器人各部分(几何图形,正方形长方形圆柱体)后组装的方式,我采用导入现有模型(三维模型)的方式,这样的模型比我自己画出的模型更美观和好看,
3.之后再给机器人贴纹理,渲染环境,设置光照等,设置键盘响应函数移动机器人,使机器人身体运动,旋转观察机器人
4.总结:最终实现了能够立体观察机器人,机器人能够运动(左右上下移动),旋转,放大缩小机器人。
   但没有实现机器人的局部运动,比如只是机器人的手动或者脚动,机器人的纹理也没有贴(纹理部分自己没有学习,有空有心情再学,专门挑了一个不需要贴纹理的机器人)

二、实现步骤
方式一:使用deep exploration软件
1.先寻找一个obj模型,使用deep exploration将模型转换成cpp文件
2.将obj模型的cpp文件导入VS中,或者将cpp文件内容粘贴在VS中的项目中
3.deep exploration将模型转换成的cpp文件,是使用显示列表将模型画出来,显示列表存储了模型的顶点数据,光照材质等内容
4.在cpp文件中添加如下代码内容


#include <gl/glaux.h>
#include <gl/glu.h>
#include <GL/glut.h>
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
#include "math.h"
#include <stdio.h>


int flag = 1;
double front_Point_x, front_Point_y, front_Point_z;
double pos_Up[3], pos_Down[3], pos_Motion[3];
double viewmatrix[16], modelviewmatrix[16];
#define GLUT_MIDDLE_UP_BUTTON 0x0003
#define GLUT_MIDDLE_DOWN_BUTTON 0x0004
float PI = 3.141592654;
int listnum;//导入变量
GLfloat xangle = 0.0;
GLfloat yangle = 0.0;
GLfloat oDistance = 5.0;
int cacheX = 0;
int cacheY = 0;
int xSpeed = 1;
int ySpeed = 1;
BOOL light = true; // 光源的开/关
BOOL lp = true; // L键按下了么?
GLfloat LightAmbient[] = {
    0.5f, 0.5f, 0.5f, 1.0f }; //环境光参数
GLfloat LightDiffuse[] = {
    0.5f, 0.5f, 0.5f, 1.0f }; // 漫射光参数,不要全设置为0
GLfloat LightPosition[] = {
    0.0f, 0.0f, 2.0f, 1.0f }; // 光源位置


static GLfloat angle = 0.0;
static GLfloat movex = 0.0;
static GLfloat movey = 0.0;
static GLfloat len = 15.0;
static GLint x = 0.0, y = 0.0, z = 0.0;

/*
该部分是cpp文件内容
*/

/*绘制*/
void motion(int x, int y) //鼠标响应事件
{
   
	if (x > cacheX)
	{
   
		yangle = yangle - xSpeed;
	}
	if (x < cacheX)
	{
   
		yangle = yangle + xSpeed;
	}
	if (y > cacheY)
	{
   
		xangle = xangle + ySpeed;
	}
	if (y < cacheY)
	{
   
		xangle = xangle - ySpeed;
	}
	glutPostRedisplay();
	cacheX = x;
	cacheY = y;
}
/*
void setView() //设置观察角度
{
	glRotatef(10, 1.0, 0.0, 0.0);   //设置opengl中绘制实体的自转方式,即物体如何旋转
	glRotatef(22, 0.0, 1.0, 0.0);
	glTranslatef(-20.5, -10.0, -55.0);
	/*沿X轴正方向平移x个单位(x是有符号数)
  沿Y轴正方向平移y个单位(y是有符号数)
  沿Z轴正方向平移z个单位(z是有符号数)
	glGetDoublev(GL_MODELVIEW_MATRIX, viewmatrix);
}
*/
void SetRC() //设置渲染
{
   
	glEnable(GL_LINE_SMOOTH);
	glEnable(GL_BLEND);
	glShadeModel(GL_SMOOTH);/*设置着色模式,解决实心图形内部空间颜色填充,平滑着色*/
	glFrontFace(GL_CW);
	glEnable(GL_LINE_SMOOTH);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);/*设置颜色混合,透明度叠加*/
	glHint(GL_LINE_SMOOTH, GL_NICEST);    /* 设置反面为边缘绘制方式*/
	glEnable(GL_DEPTH_TEST);
	
	//glPolygonMode(GL_BACK, GL_FILL);     // 设置模型背面为实体
	//glPolygonMode(GL_BACK, GL_LINE);
	/*
	glPolygonMode(GL_FRONT, GL_FILL);           // 设置正面为填充方式
	glPolygonMode(GL_BACK, GL_LINE);            // 设置反面为边缘绘制方式
	glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式*/
	glEnable(GL_COLOR_MATERIAL);
}




void renderWorld() //模拟场景
{
   
	glFrontFace(GL_CCW);     //逆时针表示正面
	
	//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);        设置多边形的正面和背面为实体,填充
	//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);       // 设置多边形的正面和背面为线性,不填充
	float oXhudu = PI / (180 / xangle); //沿着X轴旋转的角度
	float oYhudu = PI / (180 / yangle); //沿着Y轴旋转的角度
	//设置场景坐标
	GLfloat btm = oDistance * cos(oXhudu);
	GLfloat vpY = oDistance * sin(oXhudu);
	GLfloat vpX 
  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值