3DSMAX模型在OPENGL中的读取与重现

合集下载

3Dmax中的模型导入和导出指南

3Dmax中的模型导入和导出指南

3Dmax中的模型导入和导出指南3D Max是一款专业的三维建模软件,它能够帮助用户创建精美的三维模型。

在使用3D Max进行建模的过程中,模型的导入和导出是非常重要的一步,它涉及到与其他软件或者设备进行数据交流和共享。

下面是一个关于3D Max中模型导入和导出的详细指南,具体步骤如下:一、导入模型1. 准备模型文件:首先,你需要准备好需要导入的模型文件。

这些文件可以是3D Max支持的格式,比如OBJ、FBX等,或者是其他三维建模软件导出的格式。

2. 打开3D Max软件:在你的电脑上双击打开3D Max软件。

3. 导入模型文件:选择“文件”菜单中的“导入”选项,然后在弹出的对话框中选择你要导入的模型文件。

点击“导入”按钮开始导入模型。

4. 调整导入设置:在导入模型之前,你可以根据需要对导入设置进行调整。

比如,你可以选择导入的模型的尺寸、是否导入贴图等。

5. 确认导入:点击“导入”按钮确认导入模型。

3D Max软件将根据你的设置将模型导入到当前的工作场景中。

二、导出模型1. 准备模型文件:在导出模型之前,你需要确保你的模型已经完成并保存好。

2. 选择导出格式:在3D Max软件中,选择“文件”菜单中的“导出”选项。

在弹出的对话框中,选择你要导出的模型的格式。

常用的导出格式包括OBJ、FBX等。

3. 设置导出选项:在选择导出格式后,你可以根据需要对导出选项进行设置。

比如,你可以选择导出的模型的尺寸、是否导出贴图等。

4. 确认导出:点击“导出”按钮确认导出模型。

根据你的设置,3D Max软件将把模型导出为指定的格式。

三、导入和导出的注意事项1. 格式兼容性:在导入和导出模型时,要确保所选的导入和导出格式是相互兼容的。

如果不兼容,可能会导致模型出现失真或者无法正常显示的问题。

2. 文件大小:要注意导出的模型文件的大小,对于较大的模型文件,可能会需要更长的时间来导入和导出。

另外,较大的文件也可能会占用更多的存储空间。

关于在OpenGL中装载3ds模型文件的分析

关于在OpenGL中装载3ds模型文件的分析
3 s文件 是 基 于” ” 储 的 . 些 块 描 述 了诸 如 场 景 数 据 . d 块 存 这 材 网 随 着 当 今 信 息 时 代 计 算 机 技 术 的突 飞 猛 进 . 维 空 间 模 拟 每 个 视 口的 状 态 . 质 . 格 数据 等等 数 据 。每 个块 都 包 含 一 个 三 技 术 已逐 步 应 用 于 各 种行 业 研 究 领 域 。同时 , D 虚拟 环 境 现实 I 和 下 一 个 块 的 偏 移 量 由 于 A t ek公 司 并 没 有 发 布关 于 3 D u ds o 模 拟 及 多媒 体 技 术 在 个 人 电脑 f C )上 的实 现 . 得 虚 拟现 实 3 s 件 格 式 的官 方 文 档 , 以 无 法 确 定所 有 块 的 功 能 f1 P 使 d文 所 3。但 (r a ra t 这 一 技 术 得 到 了更 普 遍 的 应 用 。 虚 拟 现 实技 术 就 是 . 据 这 种 块 结 构 . 管 不 理 解 某 个 块 的 功 能 , 者 对 当前 的 v t lely iu i 1 根 尽 或 是 采用 以计 算 机技 术 为核 心 的现 代 高 科 技 生 成 逼 真 的 视 、 、 听 触 块 并 不 感 兴 趣 , 可 以很 容 易 的跳 过 它 , 理 下一 个 块 。 也 处 同时 , 跟 觉一 体 化 的 特 定 范 围 的虚 拟 环 境 而 在 实 现 三 维 虚 拟 空 间模 拟 许 多 文 件 格 式 类 似 .为 了读 取 的方 便 .d 文 件 中 数据 的 存储 方 3s 的各 种 技 术 中 , 体 模 型 都 是最 基 本 元 素 。A tds 公 司的 3 式 是 It 式 的 . 就 是 说 是 高 位 放 在 后 面 . 位 放 在 前 面 。 比 物 uoek D ne l 也 低 Su i MA 具 有 强 大 的 模 型 构 建 能 力 和 简 单 直 观 的 使 用 方 法 . 如 : td X o 网格 块 的块 头 I 0 4 0 D,x0 0在 文 件 里是 以 o 0 放 的 。 04 存 是 构建 三 维 模 型 的首 选 软 件 。 文 分 析 了 3s 件 的格 式 . 论 本 d文 讨 在 块 模 式 当 中 . 们 我 了使 用 O e G p n L和 C + 言 来 装 载 3 tdoMa +语 D Su i x的 3 s 型文 始 终 用 前 2个 字 节 保 存 d模 件 , 融人 到 O e G 并 pn L创 建 的 三 维空 问场 景 中 的方 法 。 I D号 . 下 来 的 4个 字 节 接 2 Op n L 和 3 td o MAX . eG D S u i 保 存 块 的长 度 . 块 的实 而 目前 . 构 建 一 个 虚 拟 现 实 系统 主 要 有 二 种 方 案 : 种 是 际 内容 则 用 f 长 度 一 6 要 一 块 1 用 图形 开发 库 和 高 级 语 言 开 发 。 图 形 开 发 库 通 常 采 用 O eG 个 字 节 保 存 3 s 件 中 pn L d文

基于3DS与OpenGL的三维人体模型构建方法

基于3DS与OpenGL的三维人体模型构建方法

基于3DS与OpenGL的三维人体模型构建方法摘要:在应用程序中构建三维人体模型是实现三维虚拟试衣系统的一项基础工作。

在Visual C++6.0开发环境下,利用OpenGL和3DS优势互补实现人体模型的构建和交互。

克服了因OpenGL没有提供三维模型的高级命令,仅通过点、线及多边形等基本几何图元构建模型所造成的工作量和难度大的问题,实现了快速构建高质量三维人体模型的目的。

关键词:三维人体模型;OpenGL;3DS0引言三维人体建模是实现虚拟试衣的基础,也是计算机图形学和服装CAD 领域研究的热点和难点。

目前,在服装人体建模中主要使用的方法有4种:多面体建模、基于特征的服装人体曲面建模、参数化的曲面建模、以网格边界线为连续条件的三维人体建模[1]。

人体表面复杂、不规则,人体模型建立难度较大,不少学者在人体建模方面进行了相关研究。

宋庆文等[2]对人体模型数据进行分析,用NURBS曲面构建了人体的四肢和躯干,但手部和脚的原始三角型网孔依然残留着。

吴龙、张欣等[3]在单文档视图模式下调用OpenGL,通过多边形曲面造型方法来实现参数化人台设计。

盛光有、姜寿山等[4]以一种基于单目视觉测量原理的三维人体扫描装置获得的人体数据为来源,运用三角面片法构建人体表面,并把人体模型保存为标准的OBJ文件模型格式。

李基拓等[5]提出了使用正、侧、背面 4 幅正交人体图像,通过参数化变形截面环变形人体模型模板后得到带服饰纹理的个性化虚拟人,但基于照片构建的人体模型往往真实程度很差,不能真正反映人体的特征。

本文的三维人体模型构建采用多面体建模技术,在获取人体曲面数据阶段,通过Poser中的人体模型导出为3DS 文件来获得相关数据,并结合3DS和OpenGL的方法来实现模型构建和交互。

13DS文件格式3DS是非常普遍的数据格式,以3DS格式保存的三维图形文件非常丰富。

3DS文件由块组成,每个块由信息类别和下一个块的相对位置两部分组成,其中块的信息类别由ID来识别。

基于VC++6.0和OpenGL的3DS文件的读取与控制方法

基于VC++6.0和OpenGL的3DS文件的读取与控制方法

基于VC++6.0和OpenGL的3DS文件的读取与控制方法丁斌
【期刊名称】《电脑知识与技术:学术交流》
【年(卷),期】2007(000)008
【摘要】本文介绍了在Visual C++下如何使用OpenGL读取和控制3Ds Max 生成的三维模型的方法。

【总页数】2页(P832-833)
【作者】丁斌
【作者单位】东北大学秦皇岛分校管理系,河北秦皇岛066004
【正文语种】中文
【中图分类】TP317
【相关文献】
1.基于VC++和OPENGL的3ds文件的读取与控制 [J], 冯伟;周云才
2.利用lib3ds和OpenGL实现3ds文件的读取与显示 [J], 白改朝
3.基于VC++6.0和OpenGL的3DS文件的读取与控制方法 [J], 丁斌
4.基于VC++6.0和OpenGL的3DS文件的读取与控制方法 [J], 丁斌
5.基于OpenGL的3DS图形文件读取和显示 [J], 李声弘;周楚涵;董远
因版权原因,仅展示原文概要,查看原文内容请购买。

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)在我的MFC单文档项目中enableview.h和enableview.cpp负责上面的窗口建立,myopenglview.h和myopenglView.cpp主要是功能的实现1.三维网格建立:void GLGrid(float pt1x, float pt1y, float pt1z, float pt2x, float pt2y, float pt2z, int num){const float _xLen = (pt2x - pt1x) / num;const float _yLen = (pt2y - pt1y) / num;const float _zLen = (pt2z - pt1z) / num; glLineWidth(2.f);glLineStipple(1, 0x0303);//线条样式glBegin(GL_LINES);glEnable(GL_LINE_SMOOTH);int xi = 0;int yi = 0;int zi = 0;//绘制平行于X的直线for (zi = 0; zi <= num; zi++){float z = _zLen * zi + pt1z;for (yi = 0; yi <= num; yi++){float y = _yLen * yi + pt1y;glVertex3f(pt1x, y, z);glVertex3f(pt2x, y, z);}}//绘制平行于Y的直线for (zi = 0; zi <= num; zi++){float z = _zLen * zi + pt1z;for (xi = 0; xi <= num; xi++){float x = _xLen * xi + pt1x;glVertex3f(x, pt1y, z);glVertex3f(x, pt2y, z);}}//绘制平行于Z的直线for (yi = 0; yi <= num; yi++){float y = _yLen * yi + pt1y;for (xi = 0; xi <= num; xi++){float x = _xLen * xi + pt1x;glVertex3f(x, y, pt1z);glVertex3f(x, y, pt2z);}}glEnd();}void CmyopenglView::ordination() {glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH); //设置反走样glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); //设置反走样glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);glEnable(GL_POL YGON_SMOOTH);glHint(GL_POL YGON_SMOOTH_HINT, GL_NICEST);glRotatef(-45, 0.0, 1.0, 0.0);//网格glPushMatrix();glColor3f(0.9f, 0.9f, 0.9f);glTranslatef(-4, -4, -4);GLGrid(0,0,0,8,0,8,20);glPopMatrix();glPushMatrix();glTranslated(-4,4, -4);glRotatef(90, 1.0, 0.0, 0.0);glColor3f(0.9f, 0.9f, 0.0f);GLGrid(0, 0, 0, 8, 0, 8, 20);glPopMatrix();glPushMatrix();glTranslatef(-4, -4, -4);glRotatef(90, 0.0, 0.0, 1.0);glColor3f(0.0f, 0.9f, 0.0f);GLGrid(0, 0, 0, 8, 0, 8, 20);glPopMatrix();glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);glDisable(GL_POINT_SMOOTH);glDisable(GL_POL YGON_SMOOTH);}我们在ordination()函数中增加绘制x,y,z坐标的代码void CmyopenglView::ordination() {glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glEnable(GL_POINT_SMOOTH); //设置反走样glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); //设置反走样glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);glEnable(GL_POL YGON_SMOOTH);glHint(GL_POL YGON_SMOOTH_HINT, GL_NICEST);glRotatef(-45, 0.0, 1.0, 0.0);//网格glPushMatrix();glColor3f(0.9f, 0.9f, 0.9f);glTranslatef(-4, -4, -4);GLGrid(0,0,0,8,0,8,20);glPopMatrix();glPushMatrix();glTranslated(-4,4, -4);glRotatef(90, 1.0, 0.0, 0.0);glColor3f(0.9f, 0.9f, 0.0f);GLGrid(0, 0, 0, 8, 0, 8, 20);glPopMatrix();glPushMatrix();glTranslatef(-4, -4, -4);glRotatef(90, 0.0, 0.0, 1.0);glColor3f(0.0f, 0.9f, 0.0f);GLGrid(0, 0, 0, 8, 0, 8, 20);glPopMatrix();//x//glTranslatef(-2, -2, -2);glColor3f(1.0f, 0.0f, 0.0f);glBegin(GL_LINES);glVertex3f(0.0f, 0.0f, 0.0f);glVertex3f(3.5, 0.0f, 0.0f);glEnd();glPushMatrix();glTranslatef(3.5, 0.0f, 0.0f);glRotatef(90.0f, 0.0f, 1.0f, 0.0f);glutWireCone(0.027, 0.09, 10, 10);glPopMatrix();//yglColor3f(0.0f, 1.0f, 0.0f);glBegin(GL_LINES);glVertex3f(0.0f, 0.0f, 0.0f);glVertex3f(0.0, 3.5, 0.0f);glEnd();glPushMatrix();glTranslatef(0.0, 3.5, 0.0f);glRotatef(90.0f, -1.0f, 0.0f, 0.0f);glutWireCone(0.027, 0.09, 10, 10);glPopMatrix();//zglColor3f(0.0f, 0.0f, 1.0f);glBegin(GL_LINES);glVertex3f(0.0f, 0.0f, 0.0f);glVertex3f(0.0, 0.0f, 3.5);glEnd();glPushMatrix();glTranslatef(0.0, 0.0f, 3.5);glRotatef(90.0f, 0.0f, 0.0f, 1.0f);glutWireCone(0.027, 0.09, 10, 10);glPopMatrix();glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);glDisable(GL_POINT_SMOOTH);glDisable(GL_POL YGON_SMOOTH); }、2.基本三维图形创建点模型/线模型/面模型glColor3f(1.0f, 1.0f, 1.0f);if (model == 1){if (type == 1)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);if (type == 2)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if (type == 3)glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);auxSolidCube(4);}if (model == 2){if (type == 1)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);if (type == 2)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if(type == 3)glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);auxSolidSphere(3.0);}if (model == 3){glPushMatrix();glRotatef(90, -1.0, 0.0, 0.0);if (type == 1)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);if (type == 2)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if (type == 3)glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);glutSolidCone(3, 3, 100, 100);glPopMatrix();}if (model == 4){if (type == 1)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);if (type == 2)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if (type == 3)glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);glutSolidTeapot(2.5);}3.鼠标相应旋转缩放BOOL enableview::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){// TODO: 在此添加消息处理程序代码和/或调用默认值double a = zDelta / 120;if ((scale + a * 0.1) < 10)scale += a * 0.1;this->InvalidateRect(NULL, FALSE);return CView::OnMouseWheel(nFlags, zDelta, pt);}void enableview::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if (nFlags & MK_LBUTTON == TRUE) {//MessageBox("mouse move function triggered!", "attentino", MB_OK);du += point.x - oldmx; //鼠标在窗口x轴方向上的增量加到视点绕y轴的角度上,这样就左右转了h += 0.03f*(point.y - oldmy); //鼠标在窗口y轴方向上的改变加到视点的y坐标上,就上下转了if (h>15.0f) h = 15.0f; //视点y坐标作一些限制,不会使视点太奇怪else if (h<-5.0f) h = -5.0f;oldmx = point.x, oldmy = point.y; //把此时的鼠标坐标作为旧值,为下一次计算增量做准备/*CString debug;debug.Format(_T("h,du= %0.3f %3d\n"), h, du);OutputDebugString(debug);*///OnPaint();this->OnDraw(this->GetDC()); //重绘界面}else if (nFlags & MK_RBUTTON == TRUE){oldmx += point.x - oldmx;oldmy += point.y - oldmy;glTranslatef(oldmx, oldmy, -0.1f);this->OnDraw(this->GetDC());oldmx = point.x, oldmy = point.y;}else {oldmx = point.x, oldmy = point.y;//OutputDebugString(_T("mouse up\n"));}//CView::OnMouseMove(nFlags, point);}4.键盘相应旋转缩放BOOL CmyopenglView::PreTranslateMessage(MSG* pMsg){if (pMsg->message == WM_KEYDOWN) // If a keydown message{if (pMsg->wParam == _T('W')){this->rotate_x += 6.0;if (this->rotate_x > 360)this->rotate_x = -360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('X')){this->rotate_x += 6.0;if (this->rotate_x < -360)this->rotate_x = 360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('A')){this->rotate_y -= 6.0;if (this->rotate_y < -360)this->rotate_y = 360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('D')){this->rotate_y += 6.0;if (this->rotate_y > 360)this->rotate_y = -360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('Z')){this->rotate_z -= 6.0;if (this->rotate_z < -360)this->rotate_z = 360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('E')){this->rotate_z += 6.0;if (this->rotate_z > 360)this->rotate_z = -360;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('Q')){if ((scale + 2) < 10)scale += 2;this->InvalidateRect(NULL, FALSE);}if (pMsg->wParam == _T('R')){scale -= 2;this->InvalidateRect(NULL, FALSE);}}return CView::PreTranslateMessage(pMsg);}5.灯光设置:单方位灯光/多方位光/多种类型光效果// 设置材质颜色GLfloat mat_ambient[] = { 0.6f, 0.6f, 0.6f, 1.0f }; // 蓝色的材质环境光GLfloat mat_diffuse[] = { 0.6f, 0.6f, 0.9f, 1.0f }; // 蓝色的材质漫反射光GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // 全白色的材质镜面反射光GLfloat mat_emission[] = { 0.5f, 0.5f, 0.5f, 1.0f }; // 淡白色的材质辐射光GLfloat no_mat[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // 无光(黑色光),用于关闭某种属性光时应用GLfloat no_shininess[] = { 0.0f }; // 无镜面反射GLfloat low_shininess[] = { 5.0f }; // 低镜面反射指数GLfloat high_shininess[] = { 70.0f }; // 高镜面反射指数void CmyopenglView::InitalLigt(){GLfloat light_position1[4] = { -52, -16, -50, 0 };GLfloat light_position2[4] = { -26, -48, -50, 0 };GLfloat light_position3[4] = { 16, -52, -50, 0 };GLfloat direction1[3] = { 52, 16, 50 };GLfloat direction2[3] = { 26, 48, 50 };GLfloat direction3[3] = { -16, 52, 50 };GLfloat light_position4[4] = { 52, 16, 50, 0 };GLfloat light_position5[4] = { 26, 48, 50, 0 };GLfloat light_position6[4] = { -16, 52, 50, 0 };GLfloat direction4[3] = { -52, -16, -50 };GLfloat direction5[3] = { -26, -48, -50 };GLfloat direction6[3] = { 16, -52, -50 };GLfloat color1[4], color2[4], color3[4], color4[4], color5[4], color6[4];glClearColor(1, 1, 1, 0);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);if (color_type == 0) { //彩色灯光color1[0] = 1; color1[1] = 0; color1[2] = 0; color1[3] = 1;color2[0] = 0.5; color2[1] = 1; color2[2] = 0; color2[3] = 1;color3[0] = 0; color3[1] = 0; color3[2] = 1; color3[3] = 1;color4[0] = 1; color4[1] = 0; color4[2] = 0; color4[3] = 1;color5[0] = 0.5; color5[1] = 1; color5[2] = 0; color5[3] = 1;color6[0] = 0; color6[1] = 0; color6[2] = 1; color6[3] = 1;GLfloat ambient[4] = { 0.3f, 0.3f, 0.3f, 1.0f };GLfloat material_color[4] = { 1, 1, 1, 0.5f };GLfloat material_specular[4] = { 0.5f, 0.5f, 0.5f, 0.5f };GLfloat material_ambient[4] = { 0.0, 0.0, 0.0, 0.0 };glLightfv(GL_LIGHT3, GL_POSITION, light_position4);glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, direction4);glLightfv(GL_LIGHT3, GL_DIFFUSE, color4);glLightfv(GL_LIGHT3, GL_SPECULAR, color4);glLightfv(GL_LIGHT4, GL_POSITION, light_position5);glLightfv(GL_LIGHT4, GL_SPOT_DIRECTION, direction5);glLightfv(GL_LIGHT4, GL_DIFFUSE, color5);glLightfv(GL_LIGHT4, GL_SPECULAR, color5);glLightfv(GL_LIGHT5, GL_POSITION, light_position6);glLightfv(GL_LIGHT5, GL_SPOT_DIRECTION, direction6);glLightfv(GL_LIGHT5, GL_DIFFUSE, color6);glLightfv(GL_LIGHT5, GL_SPECULAR, color6);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_color);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 128);glDisable(GL_LIGHT0);glDisable(GL_LIGHTING);glEnable(GL_LIGHTING);glEnable(GL_LIGHT3);glEnable(GL_LIGHT4);glEnable(GL_LIGHT5);glDisable(GL_COLOR_MATERIAL);return;}if (color_type == 1){//白色灯光glDisable(GL_LIGHT3);glDisable(GL_LIGHT4);glDisable(GL_LIGHT5);glDisable(GL_LIGHTING);GLfloat m_LightPostion[4] = { 0.0f, 10.0f, 10.0f, 1.0f };GLfloat ambientLight[] = { 0.25f, 0.25f, 0.25f, 1.0f };GLfloat diffuseLight[] = { 0.5, 0.5f, 0.5f, 1.0f };GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glEnable(GL_LIGHT0);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);}else {glDisable(GL_LIGHT3);glDisable(GL_LIGHT4);glDisable(GL_LIGHT5);glDisable(GL_LIGHTING);glDisable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);//glDisable(GL_LIGHTING);GLfloat no_ambientLight[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // 用于关掉默认的全局环境光// 设置光源的颜色GLfloat ambientLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色环境光GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色漫射光GLfloat specularLight[] = { 0.8f, 0.8f, 0.8f, 1.0f }; // 白色镜面反射光GLfloat m_LightPostion[] = { 0.0f, 0.0f, 1.0f, 0.0f }; // 光源起始位置// 1.仅漫射光if (color_type == 12) {glEnable(GL_LIGHTING);//glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); // 关掉默认的全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); // 关闭材质的环境反射光颜色glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); // 设置mat_diffuse的材质漫反射光glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); //关闭材质的镜面反射光颜色glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); // 设置材质的镜面反射指数为0glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); // 关闭材质的辐射光glEnable(GL_LIGHT0);}// 2.仅镜面光if (color_type == 13) {glEnable(GL_LIGHTING);//glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); // 关掉默认的全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, no_mat);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);glEnable(GL_LIGHT0);}// 3.漫射光与低镜面光if (color_type == 16) {glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); // 关掉默认的全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);glEnable(GL_LIGHT0);}// 4.辐射光与低镜面光if (color_type == 18) {glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); // 关掉默认的全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion);glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);glMaterialfv(GL_FRONT, GL_DIFFUSE, no_mat);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);glEnable(GL_LIGHT0);}}}6.纹理载入映射BOOL CmyopenglView::LoadImageResources() {FILE *File = NULL;AUX_RGBImageRec* textrue_Resource[6];if (model == 5 && type == 51)resource_path[0] = "shuijing.bmp";if(model == 5 && type == 52 )resource_path[0] = "earth.bmp";if (model == 5 && type == 53)resource_path[0] = "painting1.bmp";if (model == 5 && type == 54)resource_path[0] = "5.bmp";/*resource_path[1] = "image/2.bmp";resource_path[2] = "image/3.bmp";resource_path[3] = "image/4.bmp";resource_path[4] = "image/5.bmp";resource_path[5] = "image/6.bmp";*///装载图像文件资源for (int i = 0; i < 6; i++)//如果只需要一张贴图其实resource_path数组只需要一个元素就可以了{File = fopen(resource_path[0], "r");if (!File){//MessageBox(NULL, "加载图像资源文件失败!", "Fail", MB_OK);return FALSE;}fclose(File);CString str = CString(resource_path[0]);USES_CONVERSION;LPCWSTR wszClassName = A2CW(W2A(str));textrue_Resource[i] = auxDIBImageLoad(wszClassName);File = NULL;}//生成纹理glGenTextures(6, texture);for (int i = 0; i < 6; i++){glBindTexture(GL_TEXTURE_2D, texture[i]);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//Use the mipmap textureglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, \textrue_Resource[i]->sizeX, textrue_Resource[i]->sizeY, \GL_RGB, GL_UNSIGNED_BYTE, textrue_Resource[i]->data);//删除堆上的临时图像delete textrue_Resource[i]->data;delete textrue_Resource[i];}return TRUE;}void CmyopenglView::Draw_textrue() {GLUquadricObj* qobj;glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT);glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);InitalLigt(); ///初始化光照信息glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glPushMatrix();glTranslatef(0.0f, 0.0f, scale); //滚轮缩放gluLookAt(r*cos(c*du), h, r*sin(c*du), 0, 0, 0, 0, 1, 0); //从视点看远点,y轴方向(0,1,0)是上方向,鼠标拖动glRotatef(this->rotate_x, 1.0, 0.0, 0.0);glRotatef(this->rotate_y, 0.0, 1.0, 0.0);glRotatef(this->rotate_z, 0.0, 0.0, 1.0);if (iao)ordination();glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);qobj = gluNewQuadric();//画球体glBindTexture(GL_TEXTURE_2D, texture[0]);glEnable(GL_TEXTURE_2D);gluQuadricTexture(qobj, GL_TRUE);//纹理函数if (type == 51){glBegin(GL_QUADS);// Front FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, 3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(3.0f, -3.0f, 3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, 3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, 3.0f, 3.0f);// Back FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, 3.0f, -3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, 3.0f, -3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(3.0f, -3.0f, -3.0f);// Top FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, 3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, 3.0f, 3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, 3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(3.0f, 3.0f, -3.0f);// Bottom FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, -3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, -3.0f, 3.0f);// Right faceglTexCoord2f(0.0f, 0.0f); glVertex3f(3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(3.0f, 3.0f, -3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(3.0f, 3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(3.0f, -3.0f, 3.0f);// Left FaceglTexCoord2f(0.0f, 0.0f); glVertex3f(-3.0f, -3.0f, -3.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.0f, -3.0f, 3.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.0f, 3.0f, 3.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.0f, 3.0f, -3.0f);glEnd();}if( type == 52 )gluSphere(qobj, 4, 60, 60);//二次曲面qobjif( type == 53 )gluCylinder(qobj, 3.5, 3.5, 6, 26, 23);if( type == 54 )gluCylinder(qobj, 3.5, 0.0, 6, 26, 23);glPopMatrix();glDisable(GL_TEXTURE_2D);}6.读取obj模型我只是简单的读取vt,vn,f等基本参数void CmyopenglView::ReadObj(char* Filename) {VN.clear();V.clear();VT.clear();F.clear();FQ.clear();ifstream in(Filename);string aline; //逐行读入string erase;while (getline(in, aline)){if (aline[0] == 'v'){if (aline[1] == 'n') //vn{istringstream sin(aline);V ertex v;sin >> erase >> v.x >> v.y >> v.z;VN.push_back(v);}else if (aline[1] == 't')//vt{istringstream sin(aline);Texture v;sin >> erase >> v.s >> v.t;VT.push_back(v);}else //v{istringstream sin(aline);V ertex v;sin >> erase >> v.x >> v.y >> v.z;V.push_back(v);}}else if (aline[0] == 'f'){istringstream sin(aline);sin >> erase;vector<string> strvector;string temp;while (sin >> temp) {strvector.push_back(temp);}if (strvector.size() == 3) {//三角面片Face fff;for (int count = 0; count < 3; count++) {string kkk = strvector[count];int i = 0;int num = 0;//顶点索引for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.v[count] = num;i++;num = 0;//vtnum = 0;for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.vt[0] = num;i++;num = 0;//法向量索引for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.vn[count] = num;}F.push_back(fff);}else if (strvector.size() == 4){FaceQ fff;for (int count = 0; count < strvector.size(); count++) { string kkk = strvector[count];int i = 0;int num = 0;//顶点索引for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.v[count] = num;i++;num = 0;//vtnum = 0;for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.vt[0] = num;i++;num = 0;//法向量索引for (; i < kkk.size() && kkk[i] != '/'; i++)num = num * 10 + kkk[i] - '0';fff.vn[count] = num;}FQ.push_back(fff);}}}}绘制obj模型:void CmyopenglView::OnReadobj(){model = 6;wchar_t filters[] =L"3D模型文件(*.obj)\|*.obj|所有文件(*.*)|*.*||";CFileDialog fileDlg(TRUE, NULL, NULL,OFN_HIDEREADONL Y, filters);if (fileDlg.DoModal() == IDOK){CString strBuf = fileDlg.GetPathName();USES_CONVERSION;char *Filename = T2A(strBuf.GetBuffer(0));ReadObj(Filename);}stringstream ss;ss <<"OK!";string str;ss >> str;CString s;s = str.c_str();MessageBox(s);float min_x, min_y, min_z, max_x, max_y, max_z;min_x = min_y = min_z = 10000000;max_x = max_y = max_z = -1000000;for (int i = 0; i < V.size(); i++){min_x = min(min_x, V[i].x);min_y = min(min_y, V[i].y);min_z = min(min_z, V[i].z);max_x = max(max_x, V[i].x);max_y = max(max_y, V[i].y);max_z = max(max_z, V[i].z);}worldx = (min_x + max_x) / 2;worldy = (min_y + max_y) / 2;worldz = (min_z + max_z) / 2;type = 1;Invalidate();CDC* ppDC = GetWindowDC();OnDrawGL(ppDC);// TODO: 在此添加命令处理程序代码}void CmyopenglView::Draw_obj(){if (type == 1) {if (!VN.empty()) {for (int i = 0; i < F.size(); i++) {glBegin(GL_LINE_LOOP);for (int j = 0; j < 3; j++) {glV ertex3f(V[F[i].v[j] - 1].x, V[F[i].v[j] - 1].y, V[F[i].v[j] - 1].z);}glEnd();}for (int i = 0; i < FQ.size(); i++) {glBegin(GL_LINE_LOOP);for (int j = 0; j < 4; j++) {glV ertex3f(V[FQ[i].v[j] - 1].x, V[FQ[i].v[j] - 1].y, V[FQ[i].v[j] - 1].z);}glEnd();}}else {for (int i = 0; i < F.size(); i++) {glBegin(GL_LINE_LOOP);for (int j = 0; j < 3; j++) {glV ertex3f(V[F[i].v[j] - 1].x, V[F[i].v[j] - 1].y, V[F[i].v[j] - 1].z);}glEnd();}for (int i = 0; i < FQ.size(); i++) {glBegin(GL_LINE_LOOP);for (int j = 0; j < 4; j++) {glV ertex3f(V[FQ[i].v[j] - 1].x, V[FQ[i].v[j] - 1].y, V[FQ[i].v[j] - 1].z);}glEnd();}}}else if (type == 3) {glBegin(GL_POINTS);for (int i = 0; i < V.size(); i++)glV ertex3f(V[i].x, V[i].y, V[i].z);glEnd();}else{if (!VN.empty()) {for (int i = 0; i < F.size(); i++) {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_TRIANGLES);for (int j = 0; j < 3; j++) {glNormal3f(VN[F[i].vn[j] - 1].x, VN[F[i].vn[j] - 1].y, VN[F[i].vn[j] - 1].z);glV ertex3f(V[F[i].v[j] - 1].x, V[F[i].v[j] - 1].y, V[F[i].v[j] - 1].z);}glEnd();}for (int i = 0; i < FQ.size(); i++) {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_QUADS);for (int j = 0; j < 4; j++) {glNormal3f(VN[FQ[i].vn[j] - 1].x, VN[FQ[i].vn[j] - 1].y, VN[FQ[i].vn[j] - 1].z);glV ertex3f(V[FQ[i].v[j] - 1].x, V[FQ[i].v[j] - 1].y, V[FQ[i].v[j] - 1].z);}glEnd();}}else{for (int i = 0; i < F.size(); i++) {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_TRIANGLES);for (int j = 0; j < 3; j++) {glV ertex3f(V[F[i].v[j] - 1].x, V[F[i].v[j] - 1].y, V[F[i].v[j] - 1].z);}glEnd();}for (int i = 0; i < FQ.size(); i++) {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_QUADS);for (int j = 0; j < 4; j++) {glV ertex3f(V[FQ[i].v[j] - 1].x, V[FQ[i].v[j] - 1].y, V[FQ[i].v[j] - 1].z);}glEnd();}}}}。

关于OpenGL模式和D3D模式的解释

关于OpenGL模式和D3D模式的解释

OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。

opengl就是软件加速,没有的都为硬件加速,软件加速使得画面更为流畅,细腻,看上去比较舒服,硬件加速比较快,闪动的利害,画面也粗糙,但运动比较快,一般游戏中会用到,安装完显卡带的驱动程序而非windows自带的那个都会把opengl给安装上的。

DirectX是一种图形应用程序接口,简单的说它是一个辅助软件,一个提高系统性能的加速软件,由微软创建开发的,微软将定义它为“硬件设备无关性”。

Direct是直接的意思,X是很多东西,加在一起就是一组具有共性的东西前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,至今虽然已有3Dlabs提倡开发的2.0版本面世,在其中加入了很多类似于DirectX中可编程单元的设计,但厂商的用户的认知程度并不高,未来的OpenGL发展前景迷茫关于OpenGL模式和D3D模式的解释- 独乐乐不如齐乐乐点击返回766首页查看海量游戏库| 最全游戏下载| 玩家抢号专区|游戏美女云集| 随心畅谈网游| 全球网游动态| 网游百态大观| 热门话题探讨| 业内走向QQ三国>> 经验心得>> 综合>> 正文关于OpenGL模式和D3D模式的解释2007年10月10日作者:佚名进入论坛打开三国游戏图标后,在登陆前有几项设置,其中1项是选择显卡驱动模式的,应该有不少朋友不明白意思,我在新手训练区也没发现相关资料,就在网上搜了一下发到这里,希望对个别朋友有帮助,自己本来就懂的就当我说废话了,以下是正文:D3D (Direct3D):这是微软为提高3D 游戏在Win95/98中的显示性能而开发的显示程序。

这个基于显示光栅加速引擎非常强大和复杂,它在显示满屏状态,提供多边形计算、贴图场景等优化能力。

由于其只能在满屏提供优化能力,所以在3DSMAX中你只能在最大化显示视角时(如最大化显示TOP、RIGHT、LEFT和PERSPECTIVE视角),才能获得加速能力。

一种运用OpenGL导入显示3DS三维模型的方法

一种运用OpenGL导入显示3DS三维模型的方法

} 三、3DS 模型在 OpenGL 中的再现过程 1. 计算法向量 在绘制场景时,首先计算法向量,它直接影响到 光线从不同的的角度入射到模型表面,产生不同的 显示结果,如果法向量不确定,三维效果的图形是显 示不出来的。再通过模型的各种变换来实现法向量 的计算,这里. 利用自定义的方法 void CLoad3DS: : Counts( t3DModel* pModel) 来计算对象,遍历对象 的面和顶点的所有信息,从而计算出这些信息的法 向量. 再将法向量添加到法向量列表中。 2. 重绘三维模型 根据存储在自定义的数据结构的信息,OpenGL 将模型绘制出来。在 OpenGL 中重现 3DS 模型是通 过 OnDraw ( CDC * pDC ) 函 数 中 调 用 显 示 列 表 drawGL( ) 函数实现的。 下面这个方法 drawGL( ) 是画出各个物体块。 void CTriObject: : drawGL( ) { if ( normalapplied) { glBegin( GL_TRIANGLES) ; for ( i = 0; i < numfaces /3; i + + ) { / / 此处用 glVertex3f 函数带出各个面} glEnd( ) ; } } 四、结束语 本文运用 OpenGL 导入显示 3DS 三维模型,即 在利用现有强大的三维建模软件建立优秀的模型 后,实现模型在 OpenGL 交互控制,从 多 个 角 度 更 直 观 地 展 示 三 维 模 型 。 本 方 法 在 军 事 、广 播 电 视 、 CAD / CAM / CAE、娱乐、艺 术 造 型、医 疗 影 像、虚 拟 世界等领域 都 有 着 广 泛 的 应 用,它 将 避 免 大 量 地 重 复 建 模 工 作 ,且 系 统 设 计 简 单 ,有 效 地 提 高 工 作 效率。

基于3DSMAX和OpenGL的遥操作机器人图形建模

基于3DSMAX和OpenGL的遥操作机器人图形建模
o he vru lr b t A i l tv x e i n s d n o c p u e a c ln e n a vru le vr n e t Th s ft it a o o . smu a ie e p rme ti o e t a t r y i d r i i a n io m n . i t meh d c n n to l a if h e u rm e to d ln ii l b tas e u et e d v lpme tp ro - t o a o n y s tsy t er q ie n rmo ei g vv dy, u lo r d c h e e o n e d a i ln t o d f n t n o n e a to : o g wi a g o u ci fit r c in h o K e r s: AX ;Op n y wo d 3DS M e GL;g a h c l d ln r p ia l mo ei g; h ma — ma hne i tr c in y u n c i ne a t o
求, 缩短 了开发 周期 , 同时具有 良好 的人机 交 互功 能。 关键 词 :D X; p n L 图形 建模 ; 机 交互 3 SMA O e G ; 人 中 图分类号 : P 4 T 2 文献标 识 码 : A 文 章编 号 :0 0— 6 2 2 0 )4— 0 7— 4 10 08 (07 0 07 0
摘 要 : MO O N—S 3 以 T MA V X机 器人 为原 型 , 对遥操 作虚 拟预 测环 境 建模 的 需要 , 针 首先将机 器
人进行分解. 3 SM X 中建立各个局部几何模型 , 在 D A 然后 在 Vs l 4- 60环境下读取模 型参 i a C- 4 . u --

3D MAX 的55个常见小问题解答 3D MAX 的55个常见小问题解答

3D MAX 的55个常见小问题解答 3D MAX 的55个常见小问题解答

3D MAX 的55个常见小问题解答3D MAX 的55个常见小问题解答3D MAX 的55个常见小问题解答(转自wlong3d论坛)1)在MAX 3 中为何不能使用鼠标感应来锁定坐标轴,如何恢复?那是因为你无意中按了它的快捷功能键 X ,再按一次就能恢复此功能。

2 )布尔运算后材质(贴图)不能被渲染的问题。

布尔运算过后,物体会丢失自己的贴图方式和贴图坐标, 在渲染时也会给出一个警告信息框,重新为物体指定一个UVW Map 贴图方式修改器就可以了。

3)metal ray 渲染器是不是只能安装在 NT下,有没有 Win98 的版本?是的,但是现在有些朋友可以通过一些非正常的方法让它工作在Win9x中。

建议你可以在 NT4 或者 W in2000 环境下使用它。

4)在3DMax 里做了模型,怎么才能精确定位他的 X、Y、Z 坐标呢?如果是 MAX4,下面的状态栏里有 XYZ 三个输入框,在那里你可以输入一个具体的数值。

要是MAX4以前的版本,那就使用快捷键:F12。

5 )MAX 外部插件怎么安装(安装到什么地方?)怎么调出使用?第一位置:\Plugins;第二位置:\Stdplugs;第三位置:任意(在Plugin.ini 中关联位置)。

怎么样去找,很麻烦,因为情况多。

有安装程序的正规插件都有帮助,其它可以根据插件的扩展名区分,大致如下:.DLO 位于 CREATE(建立)命令面板,可建立新型对象.DLM 位于 MODIFY(变动)命令面板,属新的修改命令 .DLT 位于 MATERIAL EDITOR(材质编辑器),属特殊材质或贴图.DLR 属渲染插件,在 FILE/PREFERENCES 菜单RENDERING面板中通过 PRODUCTION 的ASSIGN 钮指定:或者在ENVIRONMENT 环境编辑器中,属特殊大气效果。

.DLE 位于 FILE/EXPORT 菜单命令中,定义新的输出格式。

3DS Max模型导入导出的常见问题与解决方法

3DS Max模型导入导出的常见问题与解决方法

3DS Max模型导入导出的常见问题与解决方法3DS Max是一款常用的三维建模和动画制作软件,它可以用于制作各种虚拟场景、游戏角色和特效。

然而,使用3DS Max进行模型导入和导出时,也会遇到一些常见问题。

本文将详细介绍这些问题,并提供相应的解决方法,以帮助读者解决类似的困扰。

一、导入模型的常见问题及解决方法1. 模型丢失或损坏:有时在导入模型时,会发现部分或全部模型丢失或损坏,无法正常显示。

解决方法是检查模型的文件格式,确保其与3DS Max兼容。

另外,也可以尝试使用其他文件格式导入模型,或者使用修复工具修复损坏的文件。

2. 模型尺寸不正确:在导入模型后,可能会发现其尺寸与原始模型不一致。

这可能是由于导入时使用了错误的单位或者比例。

解决方法是在导入模型前,确认导入选项中的单位和比例设置是否正确,如果不正确,可以手动调整导入的模型的尺寸。

3. 材质丢失或显示异常:有时,在导入模型后,可能会发现部分或全部材质丢失或显示异常。

这可能是由于模型文件中的材质路径引用错误或者使用了3DSMax不支持的材质格式。

解决方法是手动重新链接材质路径,或者将材质更换为3DS Max支持的格式。

4. 纹理失真:导入后的模型上的纹理可能会出现失真或拉伸的情况。

这通常是由于模型的UV映射不正确所致。

解决方法是使用3DS Max的UV编辑工具重新调整模型的UV映射,以确保纹理的显示效果正常。

二、导出模型的常见问题及解决方法1. 模型丢失部分细节或细节不清晰:在导出模型时,可能会发现导出的模型丢失了部分细节或者细节不够清晰。

这可能是由于导出选项设置不正确所致。

解决方法是在导出模型前,确保导出选项中的细节设置正确,比如导出的多边形数目和细节级别等。

2. 模型文件过大:导出的模型文件可能会过大,不便于传输或使用。

解决方法是在导出时,选择合适的文件格式和压缩选项。

另外,也可以使用3DS Max的优化工具对模型进行优化,减少文件大小。

3d的技巧.建模的准则.注意事项

3d的技巧.建模的准则.注意事项

======================〒【3D MAX软件设置技巧篇】〒======================= 1.3D MAX软件后的一些必要设置:(图1-1)(图1-1)2. 打开preference settings,在File中勾compress on save(文件压缩功能,可以使你的MAX文件很小)Increment on save(在你保存文件的时候,文件名会以另一名的形式保存,而不会覆盖原有的文件,这样的好处就是如果在小心断电或其它原因而导致文件的坏掉而打不开,这时就可以去打开前一个文件) (图1-2)在General中单位设为MM,去掉Use Large Toolar Buttons,打勾Auto Window/Crossing by directing,选择第一项。

(图1-4)(图1-5)打勾Lock UI Layout(面板锁定),Show Track Bar(隐藏动画面板)(图1-6)打开自定意面板,在Colors中选择Geometry中选择Freeze,把它的颜色改为全黑,这样放便看清导入的CAD。

(图1-7)(图1-4)(图1-5)(图1-6)(图1-7)单位设置为最后一项Gerneric Units。

(图1-2)3.使工具条变小,方便操作,扩大操作面积。

(图1-3)(图1-3)2.快捷键设置选择物体方法:冻结已选,冻结没选,全选(建地型的路时候有很大用处),反选,以颜色相同选择Line的点(V ertex Sub-object Mode),outline设置快捷键,V ertex Sub-object Mode这个快捷键的设置可以让你快速的切换到修改面板中,又不用点击点的这项修改命令,这个对所有具有点命令的编辑命令都是有效的,如Edit Mesh有点的命令,也同样是有效的,它还有一个好处就是,当你在次点击这个命令的时候,它可以起到关闭这个命令的作用,这样就我们就用不着费时的再次点击它来关闭这个命令,其实别看功能小,但是可以提高的建模效率,因为你可以不必要把时间花费在点击开起或者关闭这个命令的时间上。

3DS与OBJ格式的三维模型文件在OpenGL中的输入与处理

3DS与OBJ格式的三维模型文件在OpenGL中的输入与处理

3DS与OBJ格式的三维模型文件在OpenGL中的输入与处理【摘要】介绍了两种流行的三维文件的文件格式,即3DS文件与OBJ文件,并论述了如何将这些文件在OpenGL(Open Graphic Library)中进行输入和处理。

重点为OBJ文件的文件格式及怎样利用程序代码来构建模型数据结构、绘制对象模型,然后运用OpenGL实现三维显示和交互操作,并应用于地形建模、城市规划以及虚拟现实等领域。

【关键词】三维模型文件;OpenGL;3DS文件;OBJ文件1.前言OpenGL(开放图形库)作为一个开放的三维图形软件包,它独立于窗口系统和操作系统,基于OpenGL开发的应用程序可以十分方便地在各种平台间移植。

OpenGL的功能包括:建模、变换、颜色模式设置、纹理映射、位图显示以及双缓存动画等,而且借助Windows编程环境可以方便地对所构模型的人机交互进行控制。

由于其开放性和高度重用性,OpenGL已经成为业界标准[1]。

虽然OpenGL提供了一些建立形体模型的命令,但OpenGL并没有提供更为复杂的三维模型的高级命令。

在这种情况下,如果完全通过基本的几何图元—点、线、多边形来构建模型,势必十分困难;另一方面,由于3D图形技术的发展,形成了非常多的3D建模软件,这些软件建模一般比较方便,但又难以对其进行控制和交互。

因此,如何有效地利用这些资源,对于快速开发可视化系统具有非常重要的意义。

作者在本文中对两种流行的三维模型文件的文件格式进行了介绍,并通过程序实现了文件的读取。

把这些文件转换成OpenGL程序,再对其进行控制和交互操作。

2.3DS文件的输入和处理3D Studio Max是Autodesk公司开发的用于制作三维动画的应用程序,它所生成的图形文件格式是3DS文件格式。

该软件建模方便,且功能强大。

因此,可以利用3D Studio Max对构建可视化系统提供重要帮助。

这里介绍一种将3DS 文件转换成OpenGL文件的简单方法。

基于OpenGL与3DS MAX的虚拟场景漫游系统的设计与实现

基于OpenGL与3DS MAX的虚拟场景漫游系统的设计与实现

0 引 言
O e G ( pn rp i Lbay 是一 种与 硬件 、 p n L O e G ahc irr) 窗 口系统和操 作系 统相独 立 的一 系列 A I它 可 以被 集 P, 成到 U i、 n o sN n Widw T和 X Wi o x n w等窗 口系统 中。 d O eG p n L由大 量 功 能强 大 的 图形 函数 组成 , 发人 员 开 可 以利用这 些 函数 对整个 三维 图形进 行光色 渲染 , 从 而方便 地绘 制 出客观 世 界 逼 真 的 三 维景 象 ( p n L O eG 程序设 计 ) pn L既是 专业 的 3 。O eG D程序 接 口, 也是 个 功 能强 大 、 调用方 便 的底 层 3 图形 库 。它 由几 D 百个指 令或 函数组 成 , 由于这 些 函数 独立于 窗 口操 作 系统 和硬件 环境 , 因而使 用户从 具体 的硬件 和操作 系 统 中解 放 出来 , 即只 要 按 照规 定 的格 式 写程 序 , 可 就 在 支持 该语 言 的硬 件环境 下运 行 。同时 由于 O eG pn L 是 网络 透 明 的 , 以可 以在 网络 环境 下 以客 户/ 务 所 服 器 ( / ) 式工 作 。然 而在 对虚 拟 环境建 模 时 , 纯 C S模 单
c n et g t e G n o n c i I Op n L a d 3 n l DS MAX b e n V s a C + 6 0 d v l pn lt r a d raie a l. h ss s m a r l a d o iu + . e eo i gp a om e l s rmbe T i y t h t y s l f n z e s u
e h n ig h d ig meh ss c lu n t n a d maei t, T i s se sa l h s o vo s s l i o f c e c fv r n a cn a l t o u h a i mi ai tra ec n n d s l o n l hs y t m e tb i e b i u o i v s n e iin y o i・ s d i t r c n n e ie ne a t n o c n . u e s e e a d r a z si tr ci fse e l o K e r s vr a c n y wo d :i u s e e;e tb ihn d e ;Op n t l sa l i g mo l s e o fVit a c n mb e S se Ba e n Op n sg nt ai t n o ru lS e e Ra zi l y t m s d o e GL n DS M AX a d3

OpenGL曲线、曲面的绘制与3D模型的装载与显示

OpenGL曲线、曲面的绘制与3D模型的装载与显示

实验7 OpenGL曲线、曲面的绘制与3D模型的装载与显示实验目的:1)理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。

2)掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异;实验要求:1)教师领读代码;2)学生上机实验;3)针对代码1,分别或同时去掉开关1和开关2的代码注释,查看并记录实验效果;用公式说明Bezier曲线、曲面的绘制计算过程;4)针对代码2,分别或同时去掉各开关,观察并记录显示效果差异;用公式说明Bezier曲面插值点的计算过程;说明线框模型与曲面模型的区别;5)针对代码3:实验和观察材质参数、光照参数、坐标参数对实验效果的影响;6)理解均匀与非均匀样条有理曲线或曲面的差异;7)针对代码4:掌握非均匀有理B样条曲面(NURBS曲面)的曲面绘制方法;8)阅读https:///sweetdark/blog/184313代码,编写曲面裁剪和细分曲面的效果。

9)OpenGL如何装载并显示3D MAX导出的3D模型实验及代码,课外自行完成。

代码1:用四个控制点绘制一条三次Bezier曲线://Demo: 用四个控制顶点来画一条三次Bezier曲线#include <stdlib.h>#include <time.h>#include <GL/glut.h>//4个控制点的3D坐标——z坐标全为0GLfloatctrlpoints[4][3] = {{-4, -4, 0}, {-2, 4, 0}, {2, -4, 0}, {4, 4, 0}};voidinit(void){//背景色glClearColor(0.0, 0.0, 0.0, 1.0);//将控制点坐标映射为曲线坐标//参数:GL_MAP1_VERTEX_3,3维点坐标//参数2和3:控制参数t或u的取值范围[0, 1]//参数4:曲线内插值点间的步长3——3维坐标//参数5:曲线间的补偿为顶点数4个——总步长为12//参数6:控制点二维数组首元素地址//note: 若是在这里设置了相关参数,后续对ctrlpoints内容更改曲线不变glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);//打开开关——允许3维坐标控制点到参数点转换开关glEnable(GL_MAP1_VERTEX_3);glShadeModel(GL_FLAT);//代码开关2:去掉本注释,可启用反走样/*glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH); //允许直线反走样glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); // Antialias the linesglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/}void display(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);//代码开关1:去掉本注释,查看动态的曲线绘图效果:动态更新控制点坐标/*for(int t = 0; t < 4; t++) {for(int j = 0; j < 3; j++)ctrlpoints[t][j] = (rand() % 1024 / 1024.0 - 0.5) * 10;}//动态映射glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);*/glLoadIdentity();glColor3f(1.0, 0.0, 0.0);//绘制连续线段glBegin(GL_LINE_STRIP);//参数t或u取值为i/30,共计31个点for (i = 0; i <= 30; i++)glEvalCoord1f((GLfloat) i/30.0); //根据4个控制点坐标的参数化插值glEnd();/* 显示控制点*/glPointSize(5.0);glBegin(GL_POINTS);for (i = 0; i < 4; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glTranslatef(-0.1f,0.1f,0.0f);glColor3f(0.0, 1.0, 0.0);//glLineWidth(2.0);//绘制连续线段——线段数越多,曲线越光滑glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点//实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i <= 60; i++)glEvalCoord1f((GLfloat) i/60.0); //根据4个控制点坐标的参数化插值glEnd();glTranslatef(-0.1f,0.1f,0.0f);glColor3f(1.0, 1.0, 1.0);//绘制连续线段glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点//实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i <= 100; i++)glEvalCoord1f((GLfloat) i/100.0);glEnd();glutSwapBuffers();}//3D空间中绘制2D效果,采用正交投影void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);elseglOrtho(-5.0*(GLfloat)w/(GLfloat)h, 5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void keyboard(unsigned char key, int x, int y){//请参考"变换示例参考"一文,考虑添加键盘命令,交互式来控制金字塔的旋转switch (key){case 'x':case 'X':case 27: //ESC键exit(0);break;default:break;}}int main(intargc, char** argv){srand( (unsigned int)time(0) );glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使用双缓存模式和深度缓存glutInitWindowSize(800, 800);glutInitWindowPosition(0, 0);glutCreateWindow("2D Bezier曲线");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutIdleFunc(display);//设置空闲时调用的函数glutMainLoop();return 0;}效果图:动态曲线绘制效果图:关闭代码开关1,打开代码开关2,查看直线反走样效果:对比分析反走样前后曲线绘制效果差异。

基于OPENGL技术与3DSMAX的3D虚拟校园情景开发

基于OPENGL技术与3DSMAX的3D虚拟校园情景开发
维普资讯
工 程技 术
武 汉船 舶职 业技 术学 院学 报
20 0 7年 第 2期
基 于 OP NGL技 术 与 3 SMA E D X 的3 D虚 拟 校 园情 景 开发
李 莹 , 启祥 陈
( 北工 业 大学计 算机 学院 ,北武汉 湖 湖
摘 要
校 园进 行建 模 , 以让 学 生 或 家 长 在 虚拟 环 境 下 可 漫 游学校 , 校 园有较 直观 的 了解 。 对 开放 式 图 形 库 ( e a hcL bay简 称 Op n Grp i irr
Op n ) 美 国 S 公 司 推 出 的开 放 式 三 维 图 e GL 是 GI
1 1 地面 的构成 算 法 . 在 O e GL 中 , 字 地 面 是 三 维 的 , 本 文 pn 数 在
中, 出于 校 园地 面原 因 , 地 面 的 Y值 取 为 0 并 将 ,
为地 面进 行 贴 图 。运 用 三 个 数 组将 地 面初 始 化 。 ( )地 域 数 组 g tran MAP W *MAP w] 1 - eri [ — — [ ] 这是 一 个 构 成 三 维 地 面 的数 组 。X、 3: Z两 个
随着 教 育事 业 的发 展 , 校 教 育环 境 和 教 学 学 质 量都在 不 断提 升 , 而 , 校 往往对 学 生 的服 务 然 学 性工 作忽 视 了 。许 多外地 的潜在学 生 只能从 文 字
材料 中 了解 学校 情 况 , 法亲 自来 到 学 校 对校 园 无 做一个 直 观 的参 观 了解 。利 用 OP NGL技 术 对 E
维 数组 , 的作 用是 指示地 面 的平 面坐标 。 它
用 Op n e GL建 立 三 维 场 景 , 用 3 S 调 D MAX 建 模 的建 筑模 型 , 实现 虚拟 漫游 。

基于OpenGL与3DS Max的三维场景建模

基于OpenGL与3DS Max的三维场景建模

WA G X n o H ie N ib ,Z U We i j
( . rd aeMa a e n r a e n ier gC l g fC P 1 G aut n g me tB g d ,E gn ei ol eo A F,X ’n7 0 8 ,C ia i n e i 1 0 6 hn ; a
加 快 x D Ma ;三 维建 模
中图分类号
T 3 19 P 9 .
文献标识码

文章编号
10 7 2 (0 2 0 — 7 07— 80 2 1 ) 1 0 9—0 2
T r eDi e so a o ei g Ba e n Op n h e m n in lM d l sd o e GL n DS M a n a d3 x
目前 三 维应 用 已涉 及 建筑 、 品设 计 、 产 医学 、 球 地 科学 、 体力 学 等 各 个 领 域 。要 模 拟 这些 真实 的三 维 流 场景 , 以先 利用 专业 建模 软 件 3 SMa , 立 需要 的 可 D x建
务器模式工作 , 是专业的图形处理 、 科学计算等高端应 用领域的标准 图形库。O eG pn L的核心图形 函数功能 强大 , 使用灵活方便 , 并能够支持粒子系统 , 对模拟水、 火、 雪等 自然景物提供 了真实有效 的方法 。3 SM X D A 是 A t ek公 司开发 的基 于 P uo s d C系 统 的三 维 动 画渲 染
应 用作 了介绍。通过 降低 O eG pn L建立 复杂 三维模 型的难度 ,减 少建模 的工作量 。通 过利用 专业建模软件 3 SMa 的 D x 优 点 ,较快地建立复杂 的模型 ,并利 用 O eG pn L的编 程接 口对建 立的模 型进行 实时绘 制和 交互控 制,降低 建模 时间 ,

3DS Max中的模型修复与优化方法

3DS Max中的模型修复与优化方法

3DS Max中的模型修复与优化方法3DS Max是一款强大的三维建模与动画渲染软件,广泛应用于电影、游戏、建筑设计等领域。

在使用3DS Max进行模型建模时,有时会遇到模型出现问题的情况,比如模型部分丢失、面片错位、几何形状变形等。

为了保证模型的完整性和精确性,需要对模型进行修复和优化。

本文将详细介绍3DS Max中的模型修复与优化方法,以帮助用户解决模型问题。

1. 检查模型的几何结构- 打开3DS Max软件,导入模型文件。

- 使用选择工具选中模型,点击右键选择“编辑模型”。

- 在“编辑模型”界面,选择“显示”选项查看模型的各个面片和边的结构是否正常。

如果发现面片缺失、边错位等问题,需要进行修复。

2. 修复面片缺失问题- 使用选择工具选中面片缺失的部分。

- 点击3DS Max顶部菜单栏的“编辑”选项,选择“修复”功能。

- 在“修复”界面,选择“创建新面片”选项,点击确认进行修复。

根据模型的几何结构,3DS Max会自动创建缺失面片并填补空缺。

3. 修复边错位问题- 使用选择工具选中边错位的部分。

- 点击3DS Max顶部菜单栏的“编辑”选项,选择“修复”功能。

- 在“修复”界面,选择“连接两个边”选项,点击确认进行修复。

根据边的位置和方向,3DS Max会自动调整边的连接关系,修复错位问题。

4. 修复几何形状变形问题- 使用选择工具选中几何形状变形的部分。

- 点击3DS Max顶部菜单栏的“编辑”选项,选择“修复”功能。

- 在“修复”界面,选择“调整顶点位置”选项,点击确认进行修复。

根据顶点的位置和角度,3DS Max会自动调整顶点的位置,修复形状变形问题。

5. 优化模型的面片数量- 使用选择工具选中面片数量较多的部分。

- 点击3DS Max顶部菜单栏的“编辑”选项,选择“优化”功能。

- 在“优化”界面,选择“减少面片数量”选项,点击确认进行优化。

根据模型的复杂程度和细节要求,3DS Max会自动减少面片数量,提高模型的运行效率。

在OPENGL中读取3DS模型文件

在OPENGL中读取3DS模型文件

在OpenGL中读取3DS模型文件这里要解决的一个关键问题是: 如何在OpenGL中读取3DS模型文件。

在这部分介绍了3DS文件的存储格式,给出了OpenGL与3DS的接口编程,这对三维模型的创建提供了极大的方便,还综合运用其他的技术和算法来完成三维动画。

6.1 3ds文件格式简介3DS文件由许多块组成,每个块首先描述其信息类别,即该块是如何组成的。

块的信息类别用ID来标识,块还包含了下一个块的相对位置信息。

因此,即使不理解一个块的含义,也可以很容易地跳过它,因为该块中指出了下一个块的相对于该块起始位置的偏移字节数。

与许多文件格式一样,3DS二进制文件中的数据也是按低位在前、高位在后的方式组织的,例如,2个十六进制字节,4A 5C组成的整型数,表明5C是高位字节,4A是低位字节;对于长整型数,如:4A 5C 3B 8F表明5C4A是低位字,而8F3B是高位字。

下面描述块的具体定义。

块的前两项信息分别是:块的ID和块的长度(下一个块相对于该块的字节偏移量),块的ID是一个整型数,而块的长度是一个长整型数。

每个块实际上是一个层次结构,不同类型的块,其层次结构也不相同。

3DS文件中有一个基本块,其ID是4D4D,每一个3DS文件的开头都是由这样一个块构成。

基本块内的块称为主块。

为了对块的层次结构有一个初步的认识,下面给出一个图表来说明不同类型(ID)的块及其各自在文件中的位置。

如下图所示给每一个块都起了一个名字,这样更便于理解或直接转换为源程序。

图6.1 3DS文件结构图颜色块是文件中自始至终都能见到的一种块类型,颜色块总共有3种类型,它们是COL_ RGB,COL_ TRU和COL_ UNK。

6.2 存储3ds文件的数据结构本节将对程序中所用到的一些重要数据结构进行简单说明,以便使读者更进一步了解3ds文件所存储的数据。

1.t3Dmodel:struct t3DModel{int numOfObjects; // object的数量(总数)int numOfMaterials; // materials 的数量(总数)vector<tMaterialInfo> pMaterials; // 存贮materials 信息的列表vector<t3DObject> pObject; // 存贮object信息的列表};2.tMaterialInfo:struct tMaterialInfo{char strName[255]; // 材质的名字char strFile[255]; // 材质的文件名(真正存在harddisk的bmp)BYTE color[3]; // object 的颜色(RGB) (0~255)Int texureId; // 材质的ID}3.3DObject:struct t3DObject{int numOfVerts; // object 的顶点数int numOfFaces; // object 的面数int numTexVertex; // 材质坐标的个数int materialID; // 材质ID ,正是材质数组中的索引bool bHasTexture; //有材质就为真char strName[255]; // object的名字CVector3 *pVerts; // object 的顶点,将会指向一个数组CVector3 *pNormals; // object 的法线(只是一个近似的法线)将会指向一个数组CVector3 *pFaceNorm; // 面的法线,将会指向一个数组CVector3 *pFaceVert1; // 面的顶点x,将会指向一个数组CVector3 *pFaceVert2; // 面的顶点y,将会指向一个数组CVector3 *pFaceVert3; // 面的顶点z,将会指向一个数组CVector2 *pTexVerts; // 材质的坐标(二维)将会指向一个数组tFace *pFaces; // 面的结构(在后面有注解)将会指向一个数组};其中:struct tFace{int vertIndex[3]; // 组成面三角形顶点的索引(整型)int coordIndex[3]; // 组成面三角形材质的索引(整型)};6.3 3D动画的实现读取3DS文件的全部操作封装在了CLoad3DS类中,有关CLoad3DS类的具体定义所附光盘中的源程序3ds.cpp and 3ds.h。

基于3DSMax与OpenGL的机械臂仿真与控制

基于3DSMax与OpenGL的机械臂仿真与控制

c n rl ;a o e p c , o iain o DS Ma d O e GL fu d y tm o l d a h e e D o t s n t rae t o h s a c mbn t f 3 x a p n o s s se m ud a c iv s 3 o n n n
Ab ta t Ths p p r ito u e a meh d o i lt n fr rb tal n 3 Ma n p n a e n sr c : i a e nrd c s t o fsmuai o o rli DS o o T x a d O e GL b s d o VC+ +6. 0.I o n sa smu a o lt r fr d ma d o o o r c nr ls se tfu d i lt n p a o m o e n frb tam o to y tm.On p c .i a ay e i f e a e t t n ls s s k n ma c p o es o b t a l r u h g o ti me o , a d c iv s mo e n f r b t r n ma y ie t rc s fr o r lto g e merc i o T h h td n a h e e v me t o o am i n o
pj . rm ห้องสมุดไป่ตู้o
Ke r s: 3 a ; Op n y wo d DS M x e GL;smu a o i lt n; rb ta2 i oo ln
0 引 言
机 器人技 术 的研究 和 发展 , 得 机器 人 在 各 个 使 领域都 有 了 良好 的应 用 。在开 发 测试 阶段 , 种 有 一
机器臂 的运 动学 分 析 是对 杆 件 、 感 器 等机 器 传
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ቤተ መጻሕፍቲ ባይዱ
并保证产品质量,设计并实现了一套变频节能供水 设备的计算机辅助测试系统。由于变频节能供水设 备尚无国家标准, 没有任何行业性通用标准, 使得常 规的测试评价手段无法利用。因此,结合该系统的 实际情况,提出了以模糊测试模糊评价为核心的测 试流程,从而保证了测试结果的可信度。该测试系 统自投入使用以来, 用户反映较好, 实践证明该测试 系统不论是测量精度还是可靠性都符合实际需要。
3,*#)(,-K QR T 1#_,+-*Q 27AA*J($IK R 自动化与仪表 !""! ! # "
!"
计算机应用 !" # 在 $%&’() 中建立模型数据结构 场景中一个物体的数据存储结构:
!"#$%$& ’!()*! +,-$*!./"#$ 0 12! 3$(!$4!.2)56 12! 78*$.2)56 &9:8! 3$(!$4! ; < ; < 6 &9:8! 78*$ ; < ; < 6 =:(589 ; < ; < 6 > +?@AB/6 0 &2 T &2 [ F6 U U 面数加 F Q 1& M 712% M “ 78*$” 0 78*$ ; &2 < ; C < T S$!.#:12!.^ M Q 6 U U 自定义函数 78*$ ; &2 < ; F < T S$!.#:12!.? M Q 6 U U 自定义函数 78*$ ; &2 < ; E < T S$!.#:12!.B M Q 6 U U 自定义函数 > > > U U $2% JW19$ 5".&19$Y B9:’$ M Q 6 > > 1& M 712% M ] 78*$ 91’!] Q Q >
0 BP!%1:719$ 5".&19$6 12! G2R &26 12! &98S T F6 U U 文件是否结束 G2 T V F6 &2 T V F6 +,-$*!.2)5 T C6 BP!(12S 912$6 U U 文件的一行 JW19$ M &98S T T F Q 0 1& M X 5".&19$Y H$8%P!(12S M 912$ Q Q &98S T C6 U U 读取文件失败或文件结束 1& M 712% M Z=85$% :,-$*!Z Q Q U U 读取文件一行R 判断是否为 =85$% :,-$*! ) 为自定义函数 U U 712%( +,-$*!.2)5 T +,-$*!.2)5 [ F6 1& M 712% M Z/(1 V 5$’WZ Q Q 0 3$(!$4.2)5 T S$!.3$(!$4!.2)5 M Q 6 U U 自定义函数 78*$.2)5 T S$!.78*$.2)5 M Q 6 U U 自定义函数 > 1& M 712% M Z3$(!$4 91’!K Z Q Q 0 G2 T G2 [ F6 U U 点数加 F 1& M 712% M Z3$(!$4K Z Q Q 0 3$(!$4 ; G2 < ; C < T S$!.*::(%128!$.4 M Q 6 U U 自定义函数 3$(!$4 ; G2 < ; F < T S$!.*::(%128!$." M Q 6 U U 自定义函数 3$(!$4 ; G2 < ; E < T S$!.*::(%128!$.\ M Q 6 U U 自定义函数 >
3,*#)(,-K QR T 1#_,+-*Q 27AA*J($IK R … ?,C# 0Y[K 4K RVR NK RXR >K RVM 4NK R N>K R >4K R
*
"#$ %&’ 模型的读取
在 !"#$%& 中读取 012 345 模型的步骤: !在 !"#$%& 中建立自己的数据结构存储模型数据; "从 # 6 42> 文件中读取数据将其存储到 !"#$%& 程序 中; #建立 !"#$%& 绘制模型的显示列表。
收稿日期: (II( R I* R ()
但 ,-./01 并没有提供三维模型的高级命令, 它也是通过基本的几何图元—— — 点、线及多边形来 建立三维立体模型的。目前有许多优秀的三维图 形软件如 *?@ &AB, ACD,EA?,可以方便地建立 物体模型,但又难以对其进行控制 " # $ ,比如 *?@ &AB 的动画是基于关键帧而不是人机交互的。把 这些模型转换成 ,-./01 程序,再对其进行控制则 是一种比较理想的方法。在建模阶段可以利用三 维图形软件建立模型,避免在 ,-./01 中用点、线
?,C#:K 0XM
ZK T WX6 MM[0
\K RV6 RWMV
]K M6 MMMM
NK R >K W 表示 三角形 面 M 由 点 M, 点 R 和 点 W 构 成,顶点 !, ", # 分别对应点 M,点 R 和点 W, “ 4N”表示在点 !, " 之间存在一条自点 ! 到点 " 的有向边,4NK R N>K R >4K R 表示三角形 !+ "+ #+ !。有了以上信息,就可以在 !"#$%& 中读取该模 型了。而贴图坐标 $ 及 %,材质 3,*#)(,- 和光照 参数 O,7#9 ADP#C*, 1()#C* -(IJ*, ‘A:(*(A$, 2"A*-(IJ* *A, aA*:"A* :(b#, ?,--A__ :(b#, &(IJ* CA-A) 将 在 !"#$%& 中重新设定。
其中,3$(!$4!.2)5,78*$.2)5 存储点数、面数; 下标 ! 对应点号," 为 C D 3$(!$4! ; 1 < ; - < 存储点列表, 对应坐标 ( 的三个分量; E, #$ %$ &) &9:8! 78*$ ; 1 < ; - < 存 存储三角形三 储面列表, 下标 ! 是面号," 为 C D E, 个顶点对应的点号,78*$ ; 1 < ; C < 对应存储三角形顶 点 ’, 78*$ ; 1 < ; F < 对应顶点 (, 78*$ ; 1 < ; E < 对应顶点 ); =:(589 ; < ; < 用于存储面的法向量。 如果场景中有多个物体,可以用 +?@AB/ 类型 的数组存储。 !" !
!
"#$ %&’ 数据文件的存储格式
012 345 默认的数据文件是 #6 7,8 文件。 # 6 7,8 结构复杂,数据量庞大,不仅包括模型网格结 构的点和面的信息, 还包括模型的颜色、 光照、 阴影、 材质、 贴图以及各种场景设置, 并且文件以十六进制 数存储,读取比较困难。除默认的 # 6 7,8 结构外, 012 345 还可以导出其他多种文件格式,包括:# 6 09: ; 由 09: < 7,8 低版本生成的文件 = , #6 42> ; 42> ?(-# @8"A)* 文 件 = , # 6 42@ ; 42>BB 2C#$# @8"A)* 文 件=, #6 1?5 ; 4+*A>41 文件 = , #6 4B ; 49AD# B--+:*),E *A) 文件 = F G H 。以下介绍一种较简单直观的文件存储 格式—— — #6 42>。 !( ! #( &$) 文件的存储格式 #6 42> 文件以三角形网格形式存储 012 345 模型,不仅满足 !"#$%& 用多边形构造曲面时的顶
ZK T W06 YVWW
\K 006 GGGV
]K M6 MYMM
ZK ^06 RX[G
\K RV6 RWMV
]K M6 XYMM
4K M NK R >K W 4NK R N>K R >4K R
3,*#)(,-K QR T 1#_,+-*Q 27AA*J($IK R ?,C# RK 4K M NK W >K 0 4NK R N>K R >4K R
O,7#9 ADP#C*K Q2"A*MRQ 1()#C* -(IJ* ‘A:(*(A$K 5K XY6 RMM^ ZK T M6 MMMM \K V[6 WXR^ \K T V6 ^WGV
2"A*-(IJ* *AK 5K T GV6 [[00
ZK M6 MMMM
aA*:"A* :(b#K WGX06 ^RV0 9#I)##: ?,--A__ :(b#K WY^V6 0RMR 9#I)##: &(IJ* CA-A)K .#9 L R6 MMMM %)##$ L R6 MMMM N-+# L R6 MMMM
计算机应用
文章编号: #II#7’’JJ K (II( L IM7IIJ!7IJ
*?@ &AB 模型在 ,FGH01 中的读取与重现
郭 景, 雷 鸣
摘要:介绍了 *?@ &AB 文件的存储格式, 在 OE P P 下的 ,-./01 编程中完成了 *?@ &AB 建立物质模型, 再用 ,-./01 模型的读取与重现。利用现有的三维图形软件 ( 如 *?@ &AB) 对其进行控制, 随心所欲地实现虚拟现实。 关键词: 存储格式; 法向量 ,-./01; *?&AB; 中图分类号: DF*##% #*J% * 文献识别码: Q K 天津工业大学 计算机与自动化学院 N 天津 *II#!I L
相关文档
最新文档