这两节,透明度和物体的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 ; // 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 ; // Prevent From Happening
}
break; // Exit
} case WM_CLOSE: // Did We Receive A Close Message?
{
PostQuitMessage(); // Send A Quit Message
return ; // Jump Back
} case WM_KEYDOWN: // Is A Key Being Held Down?
{ keys[wParam] = TRUE; // If So, Mark It As TRUE
return ; // Jump Back
} case WM_KEYUP: // Has A Key Been Released?
{
keys[wParam] = FALSE; // If So, Mark It As FALSE
return ; // Jump Back
} case WM_SIZE: // Resize The OpenGL Window
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height
return ; // Jump Back
}
case WM_MBUTTONDOWN:
{
keys[wParam] = TRUE; // If So, Mark It As TRUE
return ;
}
case WM_LBUTTONDOWN: //左键按下
{
MouseLB=TRUE;
return ;
}
case WM_LBUTTONUP: //左键释放
{ MouseLB=FALSE;
return ;
} case WM_RBUTTONDOWN: //右键按下
{
MouseRB=TRUE; return ;
}
case WM_RBUTTONUP: //右键释放
{
MouseRB=FALSE; return ;
} case WM_MOUSEWHEEL: //滚轮
{
//keys[wParam] = FALSE;前滚:7864320
int zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
if (zDelta<) //后滚
{
zoom-=1.2f;
}else{
zoom+=1.2f;
}
//MessageBox(NULL,"you","",MB_OK|MB_ICONEXCLAMATION); return ;
}
} // Pass All Unhandled Messages To DefWindowProc
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

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

glutMouseFunc(mouse);

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

 int zDelta = GET_WHEEL_DELTA_WPARAM(wParam); 

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

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

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

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

    转自原文 有关于OpenGL.OpenGL ES.WebGL的小结 一.   OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口 ...

  2. OpenGL第18,19,20讲小结

    18讲是通过调用库函数画一些简单的二次几何体,比如球体.圆锥体.圆盘等等. 19讲简单的讲了下粒子系统.其实就是三角形贴上星星的纹理,通过启用混合(GL_BLEND)来达到一种动态的粒子效果.通过修改 ...

  3. OpenGL第15,16,17讲小结

    这三讲没有什么特别的感觉,15讲把纹理贴到3D字体上,16讲讲了雾的生成,17讲是通过以事先保存好的纹理贴图的字体来显示2D文字,这样子不用调用windows的字体,而是使用纹理中的字体.这样也在一定 ...

  4. OpenGL第12-14讲小结

    首先要为自己为什么没有写第10讲的控制3D场景和第11讲的红旗飘飘呢?因为没看啊~哈哈哈,而且我尝试着运行红旗飘飘的时候电脑蓝屏了(可能不是它的锅),暂时跳过了. 恩,12到14主要了解了这么些东西, ...

  5. OpenGL第6、7讲小结

    因为内容比较多,所以只看了两讲(强行解释). 一讲讲了如何给各个面贴纹理,一讲讲了加光照和按键控制. 现在讲的都是给规则的面贴纹理,像正方形,刚好纹理图也是正方形,那像人物模型的衣服贴起来用代码控制得 ...

  6. OpenGL1-6讲小结

    首先是第一讲,GL窗体的搭建,依葫芦画瓢,很多代码虽然解释了,最后看起来还是比较生涩.一开始按照上一篇的链接去敲的代码,结果最后while死循环了,我也不知道问题出哪儿,后来去找了个源码,还附带了更加 ...

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

    实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle: ...

  8. [整理]vimtutor章节小结

    第一讲小结 1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键. h (左移) j (下行) k (上行) l (右移) 2. 欲进入 Vim 编辑器(从命令行提示符),请输入: ...

  9. Vimtutor(中文版)学习笔记各章小结

    在Bash中直接输入 vimtutor 打开新世界!通常阅读完需要25-30分钟不等,像玩游戏一样学会vim,然后爱不释手 里面设置了很多例子通过实践操作来学,这里仅把vimtutor上的每一章小结记 ...

随机推荐

  1. C 语言指针怎么理解?

    对于程序员来说内存可以简化成这样一种东西:&lt;img src="https://pic1.zhimg.com/4d060c3f67c22cd4b07273db00f64708_b ...

  2. UIStoryboard

    UIStoryboard 目录 概述 Storyboard的创建 Storyboard中的页面跳转 文件内跳转 文件外跳转 Segues 不同类型的视图控制器在UIStoryboard上的实现 概述 ...

  3. JRebel_修改class后无法正确调试问题解决【2014-03-12】

    原文地址:http://www.cnblogs.com/hbbbs/p/3596179.html 现象 修改了class,编译后,JRebel自动装载到Web容器中.但此时调试这个类会发现无法正常调试 ...

  4. C++删除字符串中特定的字符

    原文:https://snipt.net/aolin/c-6/ //处理string类型的方法del_sp(string &str)待测试 //处理C-Style的方法可用,可以考虑将该方法改 ...

  5. 海量数据处理算法—Bit-Map

    原文:http://blog.csdn.net/hguisu/article/details/7880288 1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一 ...

  6. mysql二进制包安装与配置实战记录

    导读 一般中小型网站的开发都选择 MySQL 作为网站数据库,由于其社区版的性能卓越,搭配 PHP .Linux和 Apache 可组成良好的开发环境,经过多年的web技术发展,在业内被广泛使用的一种 ...

  7. 小白日记52:kali渗透测试之Web渗透-HTTPS攻击(Openssl、sslscan、sslyze、检查SSL的网站)

    HTTPS攻击 全站HTTPS正策划稿那位潮流趋势 如:百度.阿里 HTTPS的作用 CIA 解决的是信息传输过程中数据被篡改.窃取 [从中注入恶意代码,多为链路劫持] 加密:对称.非对称.单向 HT ...

  8. sqoop1.99.4安装与简介

    1.什么是sqoop clouder公司开发的一个在关系数据库和hdfs,hive之间数据导入导出的一个工具 2.版本及其区别 现在分为sqoop1和sqoop2 1)架构图(sqoop1和hadoo ...

  9. [Java] Servlet 3 —— 用Java生成GET/POST请求

    Servlet是SUN指定的Java服务器端编程规范,用以处理来自客户端的请求,处理并做出响应的一套基础API.Servlet是运行在 Servlet容器中的Java小程序,容器运行在服务器端,服务器 ...

  10. 基于http协议的api接口对于客户端的身份认证方式以及安全措施

    由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服 ...