OpenGL第8,9讲小结

  这两节,透明度和物体的3D运动,主要集中在第9讲,因为第9讲也用到了通过Alpha值来调整透明度的地方。

  因为要模拟星星,所以要创建的四边形需要很多,例子中创建了50个正方形。因为每个星星的属性都差不多,所以选择了用结构体来循环创建。(感觉有点像面向对象的思路。)为了让星星在翻转的时候不至于由面变成一条线,通过自己数次的测试,我理解为X,Y,Z坐标轴始终是固定在所创建的对象上的,举个例子,想像一个正方形正对着自己,然后Z轴箭头向内,尾巴朝着自己,假如让此正方形向左(你自己的左边)转90度,那么坐标轴的Z轴箭头就像固定在正方形上那样,变成了箭头指向右边,尾巴朝向自己的左边。恩,(记住坐标轴就跟长在要创建的对象上就对了,之前绕死我了,以为坐标轴轴心不动,怎么都想不明白,一步一步变换观察才发现自己理解错了)。

  所以,操作顺序是:(假设有个定点,所有的星星都围绕着这个定点运动)先在定点通过翻转,朝向星星所在点的方向,然后向星星的位置出发(代码是沿X轴移动,也就是通过两次翻转说把X轴的箭头指向了星星的位置),到达星星位置,然后再逆序两次翻转复位(最开始正对观察者,到达指定位置后仍然要正对观察者,这样才不会在翻转的时候出现一条线的情形)。

  接着就是通过改变每次循环的距离和角度变化来造就各种神奇的轨迹啦。还有,修改透明度要在创建四边形之前的位置修改,就是这里:

修改位置1的值,范围0~255,值越大越透明(看起来会很亮)对比一下,左边255,右边50(用了次10,快看不见了):

还有教程里说把深度测试关了,我试着没关也没看出什么区别。。带过吧。

  还有报各种重定义之类的问题,试着添加或者去掉外部依赖项glu.lib之类的(我之前加进去也没报错)。

  之前说过的用鼠标左右键以及滚轮控制的方法,我找到啦,因为例子代码用了windows自己的这个函数:

 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
             }
             else
             {
                 active=FALSE;                        // Program Is No Longer Active
             }

             return 0;                                // 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?
                 return 0;                            // Prevent From Happening
             }
             break;                                    // Exit
         }

         case WM_CLOSE:                                // Did We Receive A Close Message?
         {
             PostQuitMessage(0);                        // Send A Quit Message
             return 0;                                // Jump Back
         }

         case WM_KEYDOWN:                            // Is A Key Being Held Down?
         {

             keys[wParam] = TRUE;                    // If So, Mark It As TRUE
             return 0;                                // Jump Back
         }

         case WM_KEYUP:                                // Has A Key Been Released?
         {
             keys[wParam] = FALSE;                    // If So, Mark It As FALSE
             return 0;                                // Jump Back
         }

         case WM_SIZE:                                // Resize The OpenGL Window
         {
             ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height
             return 0;                                // Jump Back
         }
         case WM_MBUTTONDOWN:
             {
                 keys[wParam] = TRUE;                    // If So, Mark It As TRUE
                 return 0;
             }
        case WM_LBUTTONDOWN:  //左键按下
            {
                MouseLB=TRUE;
                return 0;
            }
         case WM_LBUTTONUP:  //左键释放
             {

                 MouseLB=FALSE;
                 return 0;
             }

        case WM_RBUTTONDOWN: //右键按下
            {
                 MouseRB=TRUE;

                return 0;
            }
        case WM_RBUTTONUP: //右键释放
            {
                MouseRB=FALSE;

                return 0;
            }

        case WM_MOUSEWHEEL: //滚轮
            {
                //keys[wParam] = FALSE;前滚:7864320
                int zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
                if (zDelta<0) //后滚
                {
                    zoom-=1.2f;
                }else{
                    zoom+=1.2f;
                }
                //MessageBox(NULL,"you","",MB_OK|MB_ICONEXCLAMATION);

                return 0;
            }
     }

     // Pass All Unhandled Messages To DefWindowProc
     return DefWindowProc(hWnd,uMsg,wParam,lParam);
 }

而我再使用glut自己的这个函数就报内存冲突的错误:

glutMouseFunc(mouse);

所以要么只用这个,要么就像我一样用上面的代码。其中

 int zDelta = GET_WHEEL_DELTA_WPARAM(wParam); 

这个是当滚轮事件触发时,用于判断是向前滚还是向后混的变量,zDelta会相应的呈正或负。我参考这个作的修改。

哎,一弄大半天都快过去了,不过弄清楚了很多问题,也蛮值得的啦。

时间: 2024-10-15 16:53:26

OpenGL第8,9讲小结的相关文章

有关于OpenGL、OpenGL ES、WebGL的小结

转自原文 有关于OpenGL.OpenGL ES.WebGL的小结 一.   OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口的规格,它用于三维图西象(二维的亦可).OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库. 关于其他的介绍我就不说了.这边我说一下有OpenGL的资源网站: OpenGL官网:http://www.opengl.org/resources/libraries/glut/ Ne

OpenGL第12-14讲小结

首先要为自己为什么没有写第10讲的控制3D场景和第11讲的红旗飘飘呢?因为没看啊~哈哈哈,而且我尝试着运行红旗飘飘的时候电脑蓝屏了(可能不是它的锅),暂时跳过了. 恩,12到14主要了解了这么些东西,一个使用List来批量创建重复的对象,还有就是显示3D文字. 创建一个List:(方便自己记直接贴代码了,其实就是懒) GLvoid BuildLists() { box = glGenLists(2);// 创建两个显示列表的名称 glNewList(box,GL_COMPILE); // 创建第

OpenGL第6、7讲小结

因为内容比较多,所以只看了两讲(强行解释). 一讲讲了如何给各个面贴纹理,一讲讲了加光照和按键控制. 现在讲的都是给规则的面贴纹理,像正方形,刚好纹理图也是正方形,那像人物模型的衣服贴起来用代码控制得多麻烦啊. 在创建纹理贴图的时候,一次创建多少个就要修改其参数 之前只贴一种纹理的时候,哪怕我for循环六个面贴了不同纹理,但每次只创建了一个,所以是1,之后此程序一次创建了三个纹理,故写成了3,为了六个面不同,我用了二维数组 这样就可以既满足6个面都不同,又可以满足三种效果的切换. 贴一下每个面使

OpenGL 资源汇编

本文收集和汇总了 OpenGL 的文档.教程和在线书籍,供学习和开发人员参考. OPENGL开发教程:http://www.linuxgraphics.cn/opengl/index.html OpenGL 教程 大名鼎鼎的 Nehe 教程: http://nehe.gamedev.net/ OpenGL 入门学习系列讲的非常清楚,推荐. OpenGL入门学习之一--编写第一个OpenGL程序 OpenGL入门学习之二--绘制几何图形 OpenGL入门学习之三--绘制几何图形的一些细节问题 Op

OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)

实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle::CS_ORBIT”. b.键盘WSAD键移动镜头,鼠标拖拽改变镜头方向,类似于OGRE中的“OgreBites::CameraStyle::CS_FREELOOK”. 1.坐标变换的一个例子,两种思路理解多个变换的叠加 现在考虑Scale(1,2,1); Transtale(2,1,0); Rot

第六篇 VIM你值得拥有!

vim 是一个具有很多命令的功能非常强大的编辑器.限于篇幅,在本教程当中      就不详细介绍了.本教程的设计目标是讲述一些必要的基本命令,而掌握好这      些命令,您就能够很容易将vim当作一个通用的万能编辑器来使用了. 完成本教程的内容大约需要25-30分钟,取决于您训练的时间. 每一节的命令操作将会更改本文.推荐您复制本文的一个副本,然后在副本上      进行训练(如果您是通过"vimtutor"来启动教程的,那么本文就已经是副本了). 切记一点∶本教程的设计思路是在使用

TEST

实验一 Linux基础 Man man指令 找函数 ? ? ? ? ? ? ? ? ? ? ? 实验二 Linux下C语言编程基础 删除文本 成功删除 文本编辑之插入 成功插入 文本编辑之添加 添加完成 编辑文件 Vim [文件名]进行编辑,:wq保存退出 第一讲小结 删除类命令 删改成功 运用d$删除到行末 更多的删除命令 使用计数指定动作 使用计数删除更多 成功删除 删除整行 成功删除 撤销类命令 指令撤销 完成修改之后撤销 第二讲小结 置入类命令 成功归位 替换类命令 修改完毕 更改类命令

vim编辑器的常见使用功能

Vim是一个类似于vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性. 掌握简单的vim命令可以大大提高我们编辑文档效率,在装有vim编辑器的linux系统终端输入vimtutor,将会打开一份系统自带的vim编辑器的使用说明. 以下总结皆来自该文本内容,博主把小结部分摘取出来,方便平时查阅. 第一讲小结 1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键.         h (左移)       j (下行)       k (上行)   

VIMTUTOR《VIM教程》

=============================================================================== =      欢     迎     阅     读   < V I M  教  程 >   ——      版本 1.7      = ===============================================================================      Vim 是一个具有很多命令的功