#include <Windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <GL/glut.h>
#include "objloader.h"
#include "Camera.h"
HGLRC hRC=NULL;
HDC hDC=NULL;
HWND hWnd=NULL;
HINSTANCE hInst;
bool keys[256];
bool active = true;
bool fullscreen = false;
GLfloat rquad = 10;
GLfloat dx = 0,dy = 0,dz = 0;
GLfloat ax = 0,ay = 0,az = 0;
GLint mx = 0,my = 0;
GLint MouseDown = 0;
objloader obj;
float rtri;
CCamera camera;
//每个 Windows 桌面应用程序必须具有一个窗口过程函数
//此函数处理应用程序从操作系统中接收的大量消息。
//例如,如果应用程序的对话框中有“确定”按钮,那么用户单击该按钮时,
//操作系统会向应用程序发送一条消息,通知按钮已被单击。WndProc 负责对该事件作出响应。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//设置材质
GLvoid setMaterial(Materail &mat)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,mat.ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat.diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat.specular);
glMaterialfv(GL_FRONT,GL_EMISSION,mat.emission);
glMaterialf(GL_FRONT,GL_SHININESS,100);
}
GLvoid setLight()
{
static const GLfloat light_position[] = {50.0f,50.0f,50.0f,0.0f};
static const GLfloat light_ambient[] = {0.0f,0.0f,0.0f,0.0f};
static const GLfloat light_diffuse[] = {1.0f,0.9f,0.9f,0.0f};
static const GLfloat light_specular[] = {1.0f,1.0f,1.0f,0.0f};
static const GLfloat light_direction[] = {-1.0f,-1.0f,-1.0f};
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,light_direction);
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,10.0f);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,120.0f);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
{
if(height==0)
{
height=1;
}
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75.0f,(GLfloat)width/(GLfloat)height,0.1f,10000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,100,10,-72,0,300,0,1,0);
}
int InitGL(GLvoid)
{
if(!obj.LoadMtl("xuanwu.mtl"))
{
return 0;
}
obj.LoadFile("xuanwu.obj");
obj.parsegroup();
glClearColor(0.93,0.94,0.98,1.0);
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
//glDepthFunc(GL_LEQUAL);
setLight();
return 1;
}
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
//glMatrixMode(GL_MODELVIEW);
//glLoadIdentity();
//camera.Look();
glPushMatrix();
glTranslatef(dx, dy, dz);
glRotatef(ax, 1.0f,0.0f, 0.0f);
glRotatef(ay, 0.0f,1.0f, 0.0f);
map<string, vector<facetriangle>>::iterator it;
for(it= obj.objgroups.begin();it!=obj.objgroups.end();it++)
{
vector<facetriangle> face = it->second;
for(int j=0;j<face.size(); j++)
{
setMaterial(obj.mat[face[j].mtlname]);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,obj.mat[face[j].mtlname].map);
glBegin(GL_TRIANGLES);
facetriangle f= face[j];
for(int i=0;i<f.normal.size();i++)
{
vertexture vt =obj.texcoords[f.texture[i]-1];
vertice v=obj.vertexs[f.vertext[i]-1];
glTexCoord3f(vt.x,vt.y, vt.z);
glVertex3f(v.x, v.y, v.z);
}
glBindTexture(GL_TEXTURE_2D,0);
glEnd();
}
}
glPopMatrix();
return TRUE; // 一切 OK
}
GLvoid KillGLWindow(GLvoid) // 正常销毁窗口
{
if (fullscreen) // 我们处于全屏模式吗?
{
ChangeDisplaySettings(NULL,0); // 是的话,切换回桌面
ShowCursor(TRUE); // 显示鼠标指针
}
if (hRC) // 我们拥有OpenGL渲染描述表吗?
{
if (!wglMakeCurrent(NULL,NULL)) // 我们能否释放DC和RC描述表?
{
MessageBox(NULL,"释放DC或RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)) // 我们能否删除RC?
{
MessageBox(NULL,"释放RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL; // 将RC设为 NULL
}
if (hDC && !ReleaseDC(hWnd,hDC)) // 我们能否释放 DC?
{
MessageBox(NULL,"释放DC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
hDC=NULL; // 将 DC 设为 NULL
}
if (hWnd && !DestroyWindow(hWnd)) // 能否销毁窗口?
{
MessageBox(NULL,"释放窗口句柄失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
hWnd=NULL; // 将 hWnd 设为 NULL
}
if (!UnregisterClass("OpenG",hInst)) // 能否注销类?
{
MessageBox(NULL,"不能注销窗口类。","关闭错误",MB_OK | MB_ICONINFORMATION);
hInst=NULL; // 将 hInstance 设为 NULL
}
}
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat;
WNDCLASS wc;
DWORD dwExStyle; // 扩展窗口风格
DWORD dwStyle;
RECT WindowRect; // 取得矩形的左上角和右下角的坐标值
WindowRect.left=(long)0; // 将Left 设为 0
WindowRect.right=(long)width; // 将Right 设为要求的宽度
WindowRect.top=(long)0; // 将Top 设为 0
WindowRect.bottom=(long)height; // 将Bottom 设为要求的高度
fullscreen=fullscreenflag; // 设置全局全屏标志
hInst = GetModuleHandle(NULL); // 取得我们窗口的实例
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 移动时重画,并为窗口取得DC
wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc处理消息
wc.cbClsExtra = 0; // 无额外窗口数据
wc.cbWndExtra = 0; // 无额外窗口数据
wc.hInstance = hInst; // 设置实例
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // 装入缺省图标
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 装入鼠标指针
wc.hbrBackground = NULL; // GL不需要背景
wc.lpszMenuName = NULL; // 不需要菜单
wc.lpszClassName = "OpenG"; // 设定类名字
if (!RegisterClass(&wc)) // 尝试注册窗口类
{
MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 退出并返回FALSE
}
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // 扩展窗体风格
dwStyle=WS_OVERLAPPEDWINDOW; // 窗体风格
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // 调整窗口达到真正要求的大小
if (!(hWnd=CreateWindowEx( dwExStyle, // 扩展窗体风格
"OpenG", // 类名字
title, // 窗口标题
WS_CLIPSIBLINGS | // 必须的窗体风格属性
WS_CLIPCHILDREN | // 必须的窗体风格属性
dwStyle, // 选择的窗体属性
0, 0, // 窗口位置
WindowRect.right-WindowRect.left, // 计算调整好的窗口宽度
WindowRect.bottom-WindowRect.top, // 计算调整好的窗口高度
NULL, // 无父窗口
NULL, // 无菜单
hInst, // 实例
NULL))) // 不向WM_CREATE传递任何东东
{
KillGLWindow(); // 重置显示区
MessageBox(NULL,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
static PIXELFORMATDESCRIPTOR pfd= // /pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式
{
sizeof(PIXELFORMATDESCRIPTOR), // 上述格式描述符的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 格式支持窗口
PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL
PFD_DOUBLEBUFFER, // 必须支持双缓冲
PFD_TYPE_RGBA, // 申请 RGBA 格式
bits, // 选定色彩深度
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 无Alpha缓存
0, // 忽略Shift Bit
0, // 无累加缓存
0, 0, 0, 0, // 忽略聚集位
16, // 16位 Z-缓存 (深度缓存)
0, // 无蒙板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘图层
0, // Reserved
0, 0, 0 // 忽略层遮罩
};
if (!(hDC=GetDC(hWnd))) // 取得设备描述表了么?
{
KillGLWindow(); // 重置显示区
MessageBox(NULL,"不能创建一种相匹配的像素格式","错误",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
以obj格式组织的建筑物,利用opengl读取解析并实现可视化,可以实现纹理贴图 (121个子文件)
concrete.bmp 192KB
objreader.vcxprojResolveAssemblyReference.cache 713B
objreader.vcxprojResolveAssemblyReference.cache 713B
mainframe.cpp 12KB
Camera.cpp 10KB
objloader.cpp 8KB
Vector.cpp 3KB
objreader.exe 330KB
objreader.exe 64KB
OPENGLOBJ.vcxproj.filters 2KB
objreader.vcxproj.filters 2KB
Camera.h 3KB
objloader.h 2KB
Vector.h 2KB
vertex.h 166B
vertext.h 166B
vc100.idb 851KB
objreader.ilk 1.34MB
objreader-b0d0b754.ipch 54.75MB
objreader.lastbuildstate 98B
objreader.lastbuildstate 70B
objreader.log 4KB
objreader.log 4KB
objreader.Build.CppClean.log 2KB
objreader.exe.embed.manifest 406B
objreader.exe.intermediate.manifest 381B
objreader.exe.intermediate.manifest 381B
objloader.obj 1.76MB
objloader.obj 1.29MB
mainframe.obj 979KB
mainframe.obj 636KB
Camera.obj 83KB
Camera.obj 42KB
Vector.obj 32KB
Vector.obj 14KB
objreader.pdb 3.15MB
objreader.pdb 987KB
vc100.pdb 676KB
vc100.pdb 492KB
objreader_manifest.rc 208B
objreader.exe.embed.manifest.res 472B
objreader.sdf 29.46MB
objreader.sln 894B
objreader.suo 28KB
CL.read.1.tlog 128KB
CL.read.1.tlog 65KB
link.read.1.tlog 19KB
link.read.1.tlog 11KB
link.command.1.tlog 8KB
CL.write.1.tlog 6KB
cl.command.1.tlog 6KB
link.command.1.tlog 4KB
CL.write.1.tlog 4KB
cl.command.1.tlog 3KB
link.write.1.tlog 2KB
link.write.1.tlog 2KB
mt.read.1.tlog 2KB
mt.command.1.tlog 1KB
mt.write.1.tlog 766B
rc.command.1.tlog 708B
mt.write.1.tlog 486B
mt.read.1.tlog 486B
mt.command.1.tlog 476B
rc.write.1.tlog 466B
rc.read.1.tlog 458B
link.7512-cvtres.read.1.tlog 2B
link.5928-cvtres.write.1.tlog 2B
link.4032-cvtres.read.1.tlog 2B
link.13252-cvtres.write.1.tlog 2B
link-cvtres.write.1.tlog 2B
link.7512.write.1.tlog 2B
link.8052-cvtres.write.1.tlog 2B
link.4032.read.1.tlog 2B
link.12496-cvtres.write.1.tlog 2B
link.12516-cvtres.read.1.tlog 2B
link.6976.read.1.tlog 2B
link.8052.read.1.tlog 2B
link.8792.read.1.tlog 2B
link.5928.write.1.tlog 2B
link.6976-cvtres.write.1.tlog 2B
link.4032.write.1.tlog 2B
link.12496.read.1.tlog 2B
link.12516-cvtres.write.1.tlog 2B
link.13048.read.1.tlog 2B
link.8052-cvtres.read.1.tlog 2B
link.12496.write.1.tlog 2B
link.7432-cvtres.write.1.tlog 2B
link.8052.write.1.tlog 2B
link.9928-cvtres.read.1.tlog 2B
link.13048.write.1.tlog 2B
link.13048-cvtres.write.1.tlog 2B
link.8792-cvtres.write.1.tlog 2B
link.13048-cvtres.read.1.tlog 2B
link.12516.write.1.tlog 2B
link.9928.read.1.tlog 2B
link.6976.write.1.tlog 2B
link-cvtres.read.1.tlog 2B
link.13252.read.1.tlog 2B
link.7432-cvtres.read.1.tlog 2B
link.8792.write.1.tlog 2B
共 121 条
- 1
- 2
资源评论
加油阿七
- 粉丝: 1
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功