资源简介
opengl实现导入正方体obj文件+旋转+平移+贴图
图形学作业C++
代码片段和文件信息
#include “ObjLoader.h“
using namespace std;
GLuint texGround;
GLuint texWall;
#define BMP_Header_Length 54 //图像数据在内存块中的偏移量
string filePath = “data/cube.obj“;
ObjLoader objModel = ObjLoader(filePath);
static float c = 3.1415926 / 180.0f;
static float r = 1.0f;
static int degree = 90;
static int oldPosY = -1;
static int oldPosX = -1;
static float up_down_y = 0;
static float left_right_x = 0;
static float mousemove1 = r*cos(c*degree);
static float mousemove3 = r*sin(c*degree);
static float headx = 0.0f;
static float heady = 0.0f;
static float headz = 0.0f;
// 函数power_of_two用于判断一个整数是不是2的整数次幂
int power_of_two(int n)
{
if (n <= 0)
return 0;
return (n & (n - 1)) == 0;
}
/* 函数load_texture
* 读取一个BMP文件作为纹理
* 如果失败,返回0,如果成功,返回纹理编号
*/
GLuint load_texture(const char* file_name)
{
GLint width height total_bytes;
GLubyte* pixels = 0;
GLuint last_texture_ID = 0 texture_ID = 0;
// 打开文件,如果失败,返回
FILE* pFile = fopen(file_name “rb“);
if (pFile == 0)
return 0;
// 读取文件中图象的宽度和高度
fseek(pFile 0x0012 SEEK_SET);
fread(&width 4 1 pFile);
fread(&height 4 1 pFile);
fseek(pFile BMP_Header_Length SEEK_SET);
// 计算每行像素所占字节数,并根据此数据计算总像素字节数
{
GLint line_bytes = width * 3;
while (line_bytes % 4 != 0)
++line_bytes;
total_bytes = line_bytes * height;
}
// 根据总像素字节数分配内存
pixels = (GLubyte*)malloc(total_bytes);
if (pixels == 0)
{
fclose(pFile);
return 0;
}
// 读取像素数据
if (fread(pixels total_bytes 1 pFile) <= 0)
{
free(pixels);
fclose(pFile);
return 0;
}
// 对就旧版本的兼容,如果图象的宽度和高度不是的整数次方,则需要进行缩放
// 若图像宽高超过了OpenGL规定的最大值,也缩放
{
GLint max;
glGetIntegerv(GL_MAX_TEXTURE_SIZE &max);
if (!power_of_two(width)
|| !power_of_two(height)
|| width > max
|| height > max)
{
const GLint new_width = 256;
const GLint new_height = 256; // 规定缩放后新的大小为边长的正方形
GLint new_line_bytes new_total_bytes;
GLubyte* new_pixels = 0;
// 计算每行需要的字节数和总字节数
new_line_bytes = new_width * 3;
while (new_line_bytes % 4 != 0)
++new_line_bytes;
new_total_bytes = new_line_bytes * new_height;
// 分配内存
new_pixels = (GLubyte*)malloc(new_total_bytes);
if (new_pixels == 0)
{
free(pixels);
fclose(pFile);
return 0;
}
// 进行像素缩放
gluScaleImage(GL_RGB
width height GL_UNSIGNED_BYTE pixels
new_width new_height GL_UNSIGNED_BYTE new_pixels);
// 释放原来的像素数据,把pixels指向新的像素数据,并重新设置width和height
free(pixels);
pixels = new_pixels;
width = new_width;
height = new_height;
}
}
// 分配一个新的纹理编号
glGenTextures(1 &texture_ID);
if (texture_ID == 0)
{
free(pixels);
fclose(pFile);
return 0;
}
// 绑定新的纹理,载入纹理并设置纹理参数
// 在绑定前,先获得原来绑定的纹理编号,以便在最后进行恢复
GLint lastTextureID = last_texture_ID;
glGetIntegerv(GL_TEXTURE_BINDING_2D &lastTextureID);
glBindTexture(GL_TEXTURE_2D texture_ID);
glTexParameteri(GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_LINEAR);
相关资源
- MFC下实现OpenGL纹理贴图
- OpenGL 绘制立方体、茶壶、环面等稍复
- OpenGL视口变换
- OpenGL模拟Minecraft
- OpenGL计算机图形学2D太阳系模型
- OpenGL应用(动画渐变色显示)
- OpenGL应用2(碰撞检测)
- c++ 旋转的圆柱
- OpenGL编程指南(原书第7版)中文扫描
- c++ 图像处理(旋转、水平镜像等)
- OpenGL+MFC实现旋转、缩放、平移
- 基于MFC opengl读取obj并求法向量
-
bvh pla
yer - qtOpenGLDemo2.rar
- opengl圆柱贴图程序,可以直接运行
- opengl绘制坐标
- C++方式实现stl、obj、3DS三种3D模型加载
- openGL_c++复刻我的世界游戏
- CAD应用程序开发详解 Visual C++与Open
- OpenGL+MFC三维绘图
- opengl绘制一个单位立方体正平行投影
- VTK图形图像开发进阶_高清完整版
- Step by Step Skeletal Animation in C++ and Ope
- opengl游戏
- glut.3.7.6+.DevPak
- opengl绘制简单小动物
- kinect+openGL+openNI+opencv实现三维重建
- openGL和C++实现光线跟踪作业
- DX绘制三维旋转的立方体
- Timer时钟.zip
评论
共有 条评论