opengl 显示有纹理的四面体

在opengl贴吧中被人翻上来一个以前求助贴:

//照着NeHe的教程 lesson6,弄了个有纹理的四面体
#include <GL\glut.h>

//用 auxDIBImageLoad 来加载纹理
#include <GL\GLAUX.H>
#pragma   comment(lib,"GLAUX.lib")

#include<stdio.h>

GLuint texture[1];

AUX_RGBImageRec *LoadBMP(char *Filename) // 读取一个BMP图像
{
	FILE *File=NULL; // 文件句柄
	if (!Filename) // 确保提供了文件名
	{
		return NULL; // If Not Return NULL
	}
	File=fopen(Filename,"r"); // 检查文件是否存在
	if (File) // 文件是否存在?
	{
		fclose(File); // Close The Handle

		WCHAR   wstrFilename[MAX_PATH]={0}; 
		MultiByteToWideChar(CP_ACP,   0,  Filename,  -1,   wstrFilename,   sizeof(wstrFilename));

		return auxDIBImageLoad(wstrFilename); // 加载位图并返回指针
	}
	return NULL; // 如果加载失败, 则返回 NULL
}

int LoadGLTextures() //载入位图 并生成纹理
{
	int Status=FALSE; 
	AUX_RGBImageRec *TextureImage[1];
	memset(TextureImage,0,sizeof(void *)*1);
	if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
	{
		Status=TRUE; 
		glGenTextures(1, &texture[0]); // 创建纹理
		// 使用来自位图数据生成 的典型纹理
		glBindTexture(GL_TEXTURE_2D, texture[0]);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // 线形滤波
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	}// 线形滤波
	if (TextureImage[0]) // 纹理是否存在
	{
		if (TextureImage[0]->data) // 纹理图像是否存在
		{
			free(TextureImage[0]->data); // 释放纹理图像占用的内存
		}
		free(TextureImage[0]); // 释放图像结构
	}
	return Status; // 返回 成功状态
}

void init(void)//初始化
{
	glEnable(GL_TEXTURE_2D);
	glClearColor(0.0,0.0,0.0,0.0);
	glMatrixMode(GL_PROJECTION);
	glOrtho(0.0,200.0,200.0,200.0,0.0,200.0);
	glEnable(GL_DEPTH_TEST);
	glClearDepth(1.0f);
	LoadGLTextures() ;
}

float angel2=0.0;//旋转角度

void display(GLvoid){//显示
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity();
	glTranslatef(0.5,0.0,0.0);
	glRotatef(angel2,1.0,1.0,1.0);//按角度旋转
	glBindTexture(GL_TEXTURE_2D, texture[0]);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f, -0.2f, 0.2f); // 纹理和四边形的左下
	glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.2f, -0.2f, 0.2f); // 纹理和四边形的右下
	glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.2f, 0.2f, 0.2f); // 纹理和四边形的右上
	glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f, 0.2f, 0.2f); // 纹理和四边形的左上
	// 后面
	glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.2f, -0.2f, -0.2f); // 纹理和四边形的右下
	glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.2f, 0.2f, -0.2f); // 纹理和四边形的右上
	glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.2f, 0.2f, -0.2f); // 纹理和四边形的左上
	glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.2f, -0.2f, -0.2f); // 纹理和四边形的左下
	// 顶面
	glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f, 0.2f, -0.2f); // 纹理和四边形的左上
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f, 0.2f, 0.2f); // 纹理和四边形的左下
	glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.2f, 0.2f, 0.2f); // 纹理和四边形的右下
	glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.2f, 0.2f, -0.2f); // 纹理和四边形的右上
	// 底面
	glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.2f, -0.2f, -0.2f); // 纹理和四边形的右上
	glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.2f, -0.2f, -0.2f); // 纹理和四边形的左上
	glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.2f, -0.2f, 0.2f); // 纹理和四边形的左下
	glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.2f, -0.2f, 0.2f); // 纹理和四边形的右下
	// 右面
	glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.2f, -0.2f, -0.2f); // 纹理和四边形的右下
	glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.2f, 0.2f, -0.2f); // 纹理和四边形的右上
	glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.2f, 0.2f, 0.2f); // 纹理和四边形的左上
	glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.2f, -0.2f, 0.2f); // 纹理和四边形的左下
	// 左面
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f, -0.2f, -0.2f); // 纹理和四边形的左下
	glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.2f, -0.2f, 0.2f); // 纹理和四边形的右下
	glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.2f, 0.2f, 0.2f); // 纹理和四边形的右上
	glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f, 0.2f, -0.2f); // 纹理和四边形的左上
	glEnd();
	glFlush();

	angel2+= 0.015;//旋转角度步进

}

void main(int argc, char ** argv)
{ 
	LoadGLTextures() ;
	glutInitWindowPosition(100,100);
	glutInitWindowSize(500,500);
	glutCreateWindow("有纹理的四面体");
	init();

	LoadGLTextures() ;
	glutDisplayFunc(display);
	glutIdleFunc(display);
	glutMainLoop();
}
运行图:

记得以前搞过几个用opengl显示3DS模型的,下面几章来整理一下,回头再来研究3D重建 。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要让一个四面体公转,你需要使用OpenGL的旋转函数,例如glRotatef(),在每一帧中调用它。你需要指定一个旋转角度和一个旋转轴。这个轴应该是一个向量,它的方向应该与四面体的一个面相切,这个向量的长度应该与四面体的半径相等。 在每一帧中,你需要根据时间来计算旋转角度,然后使用glRotatef()函数旋转四面体。这样,四面体就会绕着指定的轴公转。 下面是一个简单的OpenGL代码示例,它可以让一个四面体绕着x轴公转: ``` void display() { // 计算旋转角度 float angle = glutGet(GLUT_ELAPSED_TIME) / 1000.0 * 30.0; // 每秒旋转30度 // 清除屏幕 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 设置视角 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1, 1, -1, 1, -1, 1); // 设置模型视图矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(angle, 1.0, 0.0, 0.0); // 绕x轴旋转 // 画四面体 glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.5); glColor3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.0, -0.5); glColor3f(0.0, 0.0, 1.0); glVertex3f(-0.5, 0.0, -0.5); glEnd(); // 刷新屏幕 glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("Tetrahedron Rotation"); glutDisplayFunc(display); glEnable(GL_DEPTH_TEST); glutMainLoop(); return 0; } ``` 在这个示例中,我们使用了glRotatef()函数绕着x轴旋转四面体。我们也启用了深度测试,以确保物体的前后关系正确。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值