毕业设计android opengll导入3ds,求高手做出来,有报酬

求opengl导入3dmax模型的例子-中国学网-中国IT综合门户网站
> 求opengl导入3dmax模型的例子
求opengl导入3dmax模型的例子
转载 编辑:李强
为了帮助网友解决“求opengl导入3dmax模型的例子”相关的问题,中国学网通过互联网对“求opengl导入3dmax模型的例子”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:求opengl导入3dmax模型的例子,具体解决方案如下:解决方案1:读取3ds格式的文件,一般用的比较多的就是3ds格式,还有obj格式的等等,网上有个lib3ds的包,你可以下下来看看,是一个外国人写的,可以读取3ds格式的文件并且绘制出来,你可以将包里面的函数封装成一个类,比如CModel什么的,以后用就方便了。网上也有几篇教程,也可以看看。
总之,你得现将3dsmax里的模型导出成3ds格式的文件,接下来可以使用Lib3ds包读取并绘制模型,稍微有点麻烦。通过对数据库的索引,我们还为您准备了:问:想在opengl程序中导入用3dmax制作的人物模型,载入的是.3ds文件格式,人...答:你想在程序中使用骨骼动画吧,这个3ds好像是不行的吧。 骨骼动画的问题我和同事也研究一段时间了。 http://apps./share/detail/2214048 这个你先参考下吧===========================================问:《openGL超级宝典》第4版的例子如上。 我希望实现类似效果(当然,指的...答:你意思说飞机每个面加贴图? 我只知道UVW展开可以做到===========================================问:模型是用3dsmax2009建模的,是.max的模型,如何在vc6.0环境下导入到open...答:使用3D Exploration或者Deep Exploration将3D模型转换成cpp文件,导入到vc6.0的工程中即可。===========================================问:我想做个氢氧化钙和碳酸钠的反应过程的模拟实验,想再三位的环境中实现...答:3dmax和opengl的3d模型是截然不同的,你想的太简单了,无法导入,你可以在opengl里做模型===========================================问:我想做个氢氧化钙和碳酸钠的反应过程的模拟实验,想再三位的环境中实现...答:一种方法是,3DMAX模型保存为3ds格式,网上下载个导入3ds格式的类,加到自己工程中===========================================问:请问如何将用3DMAX制作的模型文件.max文件导入OpenGL中实现在我制作的场...答:.max是3dsMAX里的专有文件格式;3ds是通用的3D格式文件,可以导入多种三维软件文件,可以说是保存3D模型的一个标准文件格式。3ds文件的结构比较复杂,要弄清楚不容易;但是如果只是导入3ds,实现读取和显示并不复杂,最快的方法当然是利用写好了...===========================================问:先说清楚哦,是计算机图形学的作业需要我们用openGL完成场景,模型只是...答:没明白你是3dmax导出出问题,还是openGL里读入纹理的API没搞明白?如果是3dmax的问题,其实你完全可以只导出obj模型,导出是选择保留UV坐标,然后在OPENGL里读入其纹理。D3D有读入纹理的API函数,OPENGL应该也是有的,具体是什么我不太清楚,相...===========================================问:首先说明我不缺分。 我需要用3ds模型导到opengl里面,opengl编程会了,...答:可以在“编辑多边型”里面有个“分离”命令,选中要分离的模型点一下。至于要怎么添加贴图,就要涉及到3dmax中的材质应用了。 按键盘上的M键,可以打开或关闭“材质编辑器”,打开后,系统默认的状态是选择了第一个示例球体,单击工具按钮组中的第一个...===========================================比如CModel什么的,以后用就方便了。网上也有几篇教程,也可以看看。 总之,你得现将3dsmax里的模型导出成3ds格式的文件,接下来可以使用Lib3ds包读取并绘制模型,稍微有...===========================================例如CModel什么的,以后用就方便了。网络上也有几篇教程,也可以看看。总之,你得现将3dsmax里的模型导出成3ds格式的文件,接下来可以使用Lib3ds包读取并绘制模型,稍微有...===========================================1.先在3DMAX里把模型做好,注意模型的材质要用贴图的方式,OpenGL里不支持多维材... ,3ds文件放到你的VC++工程目录下; 2.网上用很多3ds导入的例子,可以下载一个用来参...=========================================== 1.先在3DMAX里把模型做好,注意模型的材质要用贴图的方式,OpenGL里不支持多维... ,3ds文件放到你的VC++工程目录下; 2.网上用很多3ds导入的例子,可以下载一个用来参...===========================================
本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助Opengl 导入3Dmax制作的.3ds模型 并显示出来 - 推酷
Opengl 导入3Dmax制作的.3ds模型 并显示出来
由于opengl并没有原始支持这种模型,所以导入是件麻烦事,但是又有很多的模型是这个格式的,这次在做图形学大作业的时候,特别想用到。
开始以为很简单,就几十行代码就能解决,但是翻了好多列子,都从解析文件格式,到分离顶点,纹理格式等等,非常复杂的工作,最后才能显示模型。
因此我把网上的列子总结成了2个文件,一个头文件和一个CPP文件,文件在最后面贴出来
叫做CLoad3DS.cpp &&CLoad3DS.h
下面用nehe最简单的一个列子来展现如何导入,非常的简单 不需要管这个两个文件里面具体复杂的操作是啥,直接当成库吧。
这个模型导入进去 我把模型的包围盒的代码踢出掉了,只能显示出来看,不能某个部分运动等更具体的操作。
先看效果吧
1. 首先建一个win32程序
这里直接拿nehe的第6课 &就是那个立方体贴图的列子
lesson6.cpp
This Code Was Created By Jeff Molofee 2000
A HUGE Thanks To Fredric Echols For Cleaning Up
And Optimizing The Base Code, Making It More Flexible!
If You've Found This Code Useful, Please Let Me Know.
Visit My Site At nehe.gamedev.net
#include &windows.h&
// Header File For Windows
#include &stdio.h&
// Header File For Standard Input/Output
#include &gl\gl.h&
// Header File For The OpenGL32 Library
#include &gl\glu.h&
// Header File For The GLu32 Library
#include &gl\glaux.h&
// Header File For The Glaux Library
#include &CLoad3DS.h&
// Private GDI Device Context
// Permanent Rendering Context
hWnd=NULL;
// Holds Our Window Handle
HINSTANCE hI
// Holds The Instance Of The Application
bool keys[256];
// Array Used For The Keyboard Routine
bool active=TRUE;
// Window Active Flag Set To TRUE By Default
bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default
// X Rotation ( NEW )
// Y Rotation ( NEW )
// Z Rotation ( NEW )
GLuint texture[1];
// Storage For One Texture ( NEW )
CLoad3DS *gothicLoader=new(CLoad3DS);
t3DModel gothicM
//BoundingBox gothicBoundingB
float gothicTrans[10] = {
0, 0 , -30 ,
//表示在世界矩阵的位置
0.2 , 0.2 , 0.2 ,
//表示xyz放大倍数
0 , 0 , 0 , 0
//表示旋转
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
AUX_RGBImageRec *LoadBMP(char *Filename)
// Loads A Bitmap Image
FILE *File=NULL;
// File Handle
if (!Filename)
// Make Sure A Filename Was Given
return NULL;
// If Not Return NULL
File=fopen(Filename,&r&);
// Check To See If The File Exists
// Does The File Exist?
fclose(File);
// Close The Handle
return auxDIBImageLoad(Filename);
// Load The Bitmap And Return A Pointer
return NULL;
// If Load Failed Return NULL
int LoadGLTextures()
// Load Bitmaps And Convert To Textures
int Status=FALSE;
// Status Indicator
AUX_RGBImageRec *TextureImage[1];
// Create Storage Space For The Texture
memset(TextureImage,0,sizeof(void *)*1);
// Set The Pointer To NULL
// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
if (TextureImage[0]=LoadBMP(&Data/NeHe.bmp&))
Status=TRUE;
// Set The Status To TRUE
glGenTextures(1, &texture[0]);
// Create The Texture
// Typical Texture Generation Using Data From The Bitmap
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 Texture Exists
if (TextureImage[0]-&data)
// If Texture Image Exists
free(TextureImage[0]-&data);
// Free The Texture Image Memory
free(TextureImage[0]);
// Free The Image Structure
// Return The Status
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
// Resize And Initialize The GL Window
if (height==0)
// Prevent A Divide By Zero By
// Making Height Equal One
glViewport(0,0,width,height);
// Reset The Current Viewport
glMatrixMode(GL_PROJECTION);
// Select The Projection Matrix
glLoadIdentity();
// Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
// Select The Modelview Matrix
glLoadIdentity();
// Reset The Modelview Matrix
int InitGL(GLvoid)
// All Setup For OpenGL Goes Here
if (!LoadGLTextures())
// Jump To Texture Loading Routine ( NEW )
return FALSE;
// If Texture Didn't Load Return FALSE
glEnable(GL_TEXTURE_2D);
// Enable Texture Mapping ( NEW )
glShadeModel(GL_SMOOTH);
// Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
// Black Background
glClearDepth(1.0f);
// Depth Buffer Setup
glEnable(GL_DEPTH_TEST);
// Enables Depth Testing
glDepthFunc(GL_LEQUAL);
// The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
//导入模型 模型的文件夹尽量这样设置
//然后模型贴图 装在Data/pic里面
一定要跟前面截图的文件夹名字一样,想改得去CLoad3DS文件里面改
gothicLoader-&Import3DS(&gothicModel, &Data/3ds/GUTEMB_L.3DS&);
return TRUE;
// Initialization Went OK
int DrawGLScene(GLvoid)
// Here's Where We Do All The Drawing
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
// Reset The View
changeObject( gothicTrans );
drawModel(gothicModel,true,false);
glFlush ();
return TRUE;
// Keep Going
GLvoid KillGLWindow(GLvoid)
// Properly Kill The Window
if (fullscreen)
// Are We In Fullscreen Mode?
ChangeDisplaySettings(NULL,0);
// If So Switch Back To The Desktop
ShowCursor(TRUE);
// Show Mouse Pointer
// Do We Have A Rendering Context?
if (!wglMakeCurrent(NULL,NULL))
// Are We Able To Release The DC And RC Contexts?
MessageBox(NULL,&Release Of DC And RC Failed.&,&SHUTDOWN ERROR&,MB_OK | MB_ICONINFORMATION);
if (!wglDeleteContext(hRC))
// Are We Able To Delete The RC?
MessageBox(NULL,&Release Rendering Context Failed.&,&SHUTDOWN ERROR&,MB_OK | MB_ICONINFORMATION);
// Set RC To NULL
if (hDC && !ReleaseDC(hWnd,hDC))
// Are We Able To Release The DC
MessageBox(NULL,&Release Device Context Failed.&,&SHUTDOWN ERROR&,MB_OK | MB_ICONINFORMATION);
// Set DC To NULL
if (hWnd && !DestroyWindow(hWnd))
// Are We Able To Destroy The Window?
MessageBox(NULL,&Could Not Release hWnd.&,&SHUTDOWN ERROR&,MB_OK | MB_ICONINFORMATION);
hWnd=NULL;
// Set hWnd To NULL
if (!UnregisterClass(&OpenGL&,hInstance))
// Are We Able To Unregister Class
MessageBox(NULL,&Could Not Unregister Class.&,&SHUTDOWN ERROR&,MB_OK | MB_ICONINFORMATION);
hInstance=NULL;
// Set hInstance To NULL
/* This Code Creates Our OpenGL Window.
Parameters Are:
- Title To Appear At The Top Of The Window
- Width Of The GL Window Or Fullscreen Mode
- Height Of The GL Window Or Fullscreen Mode
- Number Of Bits To Use For Color (8/16/24/32)
* fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
// Holds The Results After Searching For A Match
// Windows Class Structure
// Window Extended Style
// Window Style
// Grabs Rectangle Upper Left / Lower Right Values
WindowRect.left=(long)0;
// Set Left Value To 0
WindowRect.right=(long)
// Set Right Value To Requested Width
WindowRect.top=(long)0;
// Set Top Value To 0
WindowRect.bottom=(long)
// Set Bottom Value To Requested Height
fullscreen=
// Set The Global Fullscreen Flag
= GetModuleHandle(NULL);
// Grab An Instance For Our Window
= CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window.
wc.lpfnWndProc
= (WNDPROC) WndP
// WndProc Handles Messages
wc.cbClsExtra
// No Extra Window Data
wc.cbWndExtra
// No Extra Window Data
wc.hInstance
// Set The Instance
= LoadIcon(NULL, IDI_WINLOGO);
// Load The Default Icon
wc.hCursor
= LoadCursor(NULL, IDC_ARROW);
// Load The Arrow Pointer
wc.hbrBackground = NULL;
// No Background Required For GL
wc.lpszMenuName
// We Don't Want A Menu
wc.lpszClassName = &OpenGL&;
// Set The Class Name
if (!RegisterClass(&wc))
// Attempt To Register The Window Class
MessageBox(NULL,&Failed To Register The Window Class.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// Return FALSE
if (fullscreen)
// Attempt Fullscreen Mode?
DEVMODE dmScreenS
// Device Mode
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
// Size Of The Devmode Structure
dmScreenSettings.dmPelsWidth =
// Selected Screen Width
dmScreenSettings.dmPelsHeight =
// Selected Screen Height
dmScreenSettings.dmBitsPerPel =
// Selected Bits Per Pixel
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// Try To Set Selected Mode And Get Results.
NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
// If The Mode Fails, Offer Two Options.
Quit Or Use Windowed Mode.
if (MessageBox(NULL,&The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?&,&NeHe GL&,MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
fullscreen=FALSE;
// Windowed Mode Selected.
Fullscreen = FALSE
// Pop Up A Message Box Letting User Know The Program Is Closing.
MessageBox(NULL,&Program Will Now Close.&,&ERROR&,MB_OK|MB_ICONSTOP);
return FALSE;
// Return FALSE
if (fullscreen)
// Are We Still In Fullscreen Mode?
dwExStyle=WS_EX_APPWINDOW;
// Window Extended Style
dwStyle=WS_POPUP;
// Windows Style
ShowCursor(FALSE);
// Hide Mouse Pointer
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
// Window Extended Style
dwStyle=WS_OVERLAPPEDWINDOW;
// Windows Style
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
// Adjust Window To True Requested Size
// Create The Window
if (!(hWnd=CreateWindowEx( dwExStyle,
// Extended Style For The Window
// Class Name
// Window Title
// Defined Window Style
WS_CLIPSIBLINGS |
// Required Window Style
WS_CLIPCHILDREN,
// Required Window Style
// Window Position
WindowRect.right-WindowRect.left, // Calculate Window Width
WindowRect.bottom-WindowRect.top, // Calculate Window Height
// No Parent Window
// No Menu
hInstance,
// Instance
// Dont Pass Anything To WM_CREATE
KillGLWindow();
// Reset The Display
MessageBox(NULL,&Window Creation Error.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// Return FALSE
static PIXELFORMATDESCRIPTOR pfd=
// pfd Tells Windows How We Want Things To Be
sizeof(PIXELFORMATDESCRIPTOR),
// Size Of This Pixel Format Descriptor
// Version Number
PFD_DRAW_TO_WINDOW |
// Format Must Support Window
PFD_SUPPORT_OPENGL |
// Format Must Support OpenGL
PFD_DOUBLEBUFFER,
// Must Support Double Buffering
PFD_TYPE_RGBA,
// Request An RGBA Format
// Select Our Color Depth
0, 0, 0, 0, 0, 0,
// Color Bits Ignored
// No Alpha Buffer
// Shift Bit Ignored
// No Accumulation Buffer
0, 0, 0, 0,
// Accumulation Bits Ignored
// 16Bit Z-Buffer (Depth Buffer)
// No Stencil Buffer
// No Auxiliary Buffer
PFD_MAIN_PLANE,
// Main Drawing Layer
// Reserved
// Layer Masks Ignored
if (!(hDC=GetDC(hWnd)))
// Did We Get A Device Context?
KillGLWindow();
// Reset The Display
MessageBox(NULL,&Can't Create A GL Device Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// Return FALSE
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
KillGLWindow();
// Reset The Display
MessageBox(NULL,&Can't Find A Suitable PixelFormat.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// Return FALSE
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
// Are We Able To Set The Pixel Format?
KillGLWindow();
// Reset The Display
MessageBox(NULL,&Can't Set The PixelFormat.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// Return FALSE
if (!(hRC=wglCreateContext(hDC)))
// Are We Able To Get A Rendering Context?
KillGLWindow();
// Reset The Display
MessageBox(NULL,&Can't Create A GL Rendering Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// Return FALSE
if(!wglMakeCurrent(hDC,hRC))
// Try To Activate The Rendering Context
KillGLWindow();
// Reset The Display
MessageBox(NULL,&Can't Activate The GL Rendering Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// Return FALSE
ShowWindow(hWnd,SW_SHOW);
// Show The Window
SetForegroundWindow(hWnd);
// Slightly Higher Priority
SetFocus(hWnd);
// Sets Keyboard Focus To The Window
ReSizeGLScene(width, height);
// Set Up Our Perspective GL Screen
if (!InitGL())
// Initialize Our Newly Created GL Window
KillGLWindow();
// Reset The Display
MessageBox(NULL,&Initialization Failed.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// Return FALSE
return TRUE;
// Success
LRESULT CALLBACK WndProc( HWND hWnd,
// Handle For This Window
UINT uMsg,
// Message For This Window
WPARAM wParam,
// Additional Message Information
LPARAM lParam)
// Additional Message Information
switch (uMsg)
// Check For Windows Messages
case WM_ACTIVATE:
// Watch For Window Activate Message
if (!HIWORD(wParam))
// Check Minimization State
active=TRUE;
// Program Is Active
active=FALSE;
// Program Is No Longer Active
// Return To The Message Loop
case WM_SYSCOMMAND:
// Intercept System Commands
switch (wParam)
// Check System Calls
case SC_SCREENSAVE:
// Screensaver Trying To Start?
case SC_MONITORPOWER:
// Monitor Trying To Enter Powersave?
// Prevent From Happening
case WM_CLOSE:
// Did We Receive A Close Message?
PostQuitMessage(0);
// Send A Quit Message
// Jump Back
case WM_KEYDOWN:
// Is A Key Being Held Down?
keys[wParam] = TRUE;
// If So, Mark It As TRUE
// Jump Back
case WM_KEYUP:
// Has A Key Been Released?
keys[wParam] = FALSE;
// If So, Mark It As FALSE
// Jump Back
case WM_SIZE:
// Resize The OpenGL Window
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
// LoWord=Width, HiWord=Height
// Jump Back
// Pass All Unhandled Messages To DefWindowProc
return DefWindowProc(hWnd,uMsg,wParam,lParam);
int WINAPI WinMain( HINSTANCE hInstance,
// Instance
HINSTANCE hPrevInstance,
// Previous Instance
lpCmdLine,
// Command Line Parameters
// Window Show State
// Windows Message Structure
BOOL done=FALSE;
// Bool Variable To Exit Loop
// Ask The User Which Screen Mode They Prefer
if (MessageBox(NULL,&Would You Like To Run In Fullscreen Mode?&, &Start FullScreen?&,MB_YESNO|MB_ICONQUESTION)==IDNO)
fullscreen=FALSE;
// Windowed Mode
// Create Our OpenGL Window
if (!CreateGLWindow(&NeHe's Texture Mapping Tutorial&,640,480,16,fullscreen))
// Quit If Window Was Not Created
while(!done)
// Loop That Runs While done=FALSE
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting?
if (msg.message==WM_QUIT)
// Have We Received A Quit Message?
done=TRUE;
// If So done=TRUE
// If Not, Deal With Window Messages
TranslateMessage(&msg);
// Translate The Message
DispatchMessage(&msg);
// Dispatch The Message
// If There Are No Messages
// Draw The Scene.
Watch For ESC Key And Quit Messages From DrawGLScene()
if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) // Active?
Was There A Quit Received?
done=TRUE;
// ESC or DrawGLScene Signalled A Quit
// Not Time To Quit, Update Screen
SwapBuffers(hDC);
// Swap Buffers (Double Buffering)
if (keys[VK_F1])
// Is F1 Being Pressed?
keys[VK_F1]=FALSE;
// If So Make Key FALSE
KillGLWindow();
// Kill Our Current Window
fullscreen=!
// Toggle Fullscreen / Windowed Mode
// Recreate Our OpenGL Window
if (!CreateGLWindow(&NeHe's Texture Mapping Tutorial&,640,480,16,fullscreen))
// Quit If Window Was Not Created
// Shutdown
KillGLWindow();
// Kill The Window
return (msg.wParam);
// Exit The Program
上图就是主要的逻辑代码,我已经改成了显示3ds模型的代码了。 &下面我指出改的地方都有哪
首先是文件目录。
3D模型一定要放在Data/3ds文件夹里面
3D模型贴图一定要放在Data/pic文件夹里面 如下图:
这是VC工程,VS是一样的,直接用nehe那个工程导入CLoad3DS 并且建立那3ds和pic两个文件夹即可, 最后讲给出全部源代码和一些网上的模型
下面是主要对nehe添加3D模型支持的代码
首先加上头文件
#include &CLoad3DS.h&
然后在定义全局变量的地方,也就是 定义完头文件紧接着就写如下 3D模型的定义
CLoad3DS *gothicLoader=new(CLoad3DS);
t3DModel gothicM
float gothicTrans[10] = {
0, 0 , -30 ,
//表示在世界矩阵的位置
0.2 , 0.2 , 0.2 ,
//表示xyz放大倍数
0 , 0 , 0 , 0
//表示旋转
上面代码很简单,就是加载了CLoad3DS类, &t3DModel类,然后定义了一个参数数组,中文说明。
定义好了后就要初始化了。
在InitGL 也就是opengl初始化那个函数里面 初始化,就一句话。
//导入模型 模型的文件夹尽量这样设置
//然后模型贴图 装在Data/pic里面
一定要跟前面截图的文件夹名字一样,想改得去CLoad3DS文件里面改
gothicLoader-&Import3DS(&gothicModel, &Data/3ds/GUTEMB_L.3DS&);
初始化直接就填你想要那个模型的XXX.3DS即可,纹理不用管,放在pic文件夹里面,他自动从模型信息里面找出纹理的对应文件名
最后就是运行了,在绘制函数里面用changeObject 导入之前设置好的参数,再用drawModel函数(在CLoad3DS定义好了的全局函数) 绘制。即可
int DrawGLScene(GLvoid)
// Here's Where We Do All The Drawing
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
// Reset The View
glPushMatrix();
changeObject( gothicTrans );
drawModel(gothicModel,true,false);
glPopMatrix();
glFlush ();
return TRUE;
// Keep Going
完成,很简单吧, 就是添加2个文件,然后三两行代码即可实现模型导入。
下面是整个工程文件。
已发表评论数()
&&登&&&录&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见

我要回帖

更多关于 android opengl 的文章

 

随机推荐