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 ; // 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讲小结的更多相关文章
- 有关于OpenGL、OpenGL ES、WebGL的小结
转自原文 有关于OpenGL.OpenGL ES.WebGL的小结 一. OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口 ...
- OpenGL第18,19,20讲小结
18讲是通过调用库函数画一些简单的二次几何体,比如球体.圆锥体.圆盘等等. 19讲简单的讲了下粒子系统.其实就是三角形贴上星星的纹理,通过启用混合(GL_BLEND)来达到一种动态的粒子效果.通过修改 ...
- OpenGL第15,16,17讲小结
这三讲没有什么特别的感觉,15讲把纹理贴到3D字体上,16讲讲了雾的生成,17讲是通过以事先保存好的纹理贴图的字体来显示2D文字,这样子不用调用windows的字体,而是使用纹理中的字体.这样也在一定 ...
- OpenGL第12-14讲小结
首先要为自己为什么没有写第10讲的控制3D场景和第11讲的红旗飘飘呢?因为没看啊~哈哈哈,而且我尝试着运行红旗飘飘的时候电脑蓝屏了(可能不是它的锅),暂时跳过了. 恩,12到14主要了解了这么些东西, ...
- OpenGL第6、7讲小结
因为内容比较多,所以只看了两讲(强行解释). 一讲讲了如何给各个面贴纹理,一讲讲了加光照和按键控制. 现在讲的都是给规则的面贴纹理,像正方形,刚好纹理图也是正方形,那像人物模型的衣服贴起来用代码控制得 ...
- OpenGL1-6讲小结
首先是第一讲,GL窗体的搭建,依葫芦画瓢,很多代码虽然解释了,最后看起来还是比较生涩.一开始按照上一篇的链接去敲的代码,结果最后while死循环了,我也不知道问题出哪儿,后来去找了个源码,还附带了更加 ...
- OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)
实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle: ...
- [整理]vimtutor章节小结
第一讲小结 1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键. h (左移) j (下行) k (上行) l (右移) 2. 欲进入 Vim 编辑器(从命令行提示符),请输入: ...
- Vimtutor(中文版)学习笔记各章小结
在Bash中直接输入 vimtutor 打开新世界!通常阅读完需要25-30分钟不等,像玩游戏一样学会vim,然后爱不释手 里面设置了很多例子通过实践操作来学,这里仅把vimtutor上的每一章小结记 ...
随机推荐
- C# Socket基础(一)之启动异步服务监听
本文主要是以代码为主..NET技术交流群 199281001 .欢迎加入. //通知一个或多个正在等待的线程已发生事件. ManualResetEvent manager = new ManualRe ...
- 3.3html学习笔记之链接
iframe 元素会创建包含另外一个文档的内联框架 <iframe src=""/> 跳转链接 <a href="#here" target= ...
- BootStrap2学习日记20---定制缩略图
先看看效果: 代码: <ul class="thumbnails"> <li class="span3"> <div class= ...
- 从零开始学JAVA(06)-WebService_Jersey_Restful
由于项目上需要写一个简单的评价系统,像银行MM前面的那种非常满意.满意.不满意那种,结合一个安卓的APP一起使用.由于使用3G网页通讯,个人认为http这种方式更合适.曾经听在Delphi鸟窝群的白雪 ...
- Mosaic HDU 4819 二维线段树入门题
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- JAVA基础之String基本操作
String str = "str"; str.length(); //3 返回字符串长度 str.indexOf("s"); //0 返回s所在 ...
- Android 高级UI设计笔记13:Gallery(画廊控件)之 循环显示图像
1. 循环显示图像的原理 循环显示有些类似于循环链表,最后一个结点的下一个结点又是第1个结点.循环显示图像也可以模拟这一点. 也许细心的读者从上一节实现的ImageAdapter类中会发现些什么.对 ...
- 重构18-Replace exception with conditional(条件替代异常)
重构没有什么出处,是我平时经常使用而总结出来的.欢迎您发表任何改进意见或建议.我相信一定还有其他比较好的重构可以解决类似的问题. 我曾无数次面对的一个代码坏味道就是,使用异常来控制程序流程.您可能会 ...
- Java程序员必备的 15框开发工具
15款Java程序员必备的开发工具 如果你是一名Web开发人员,那么用膝盖想也知道你的职业生涯大部分将使用Java而度过.这是一款商业级的编程语言,我们没有办法不接触它. 对于Java,有两种截然不同 ...
- Apache 日志分析(一)
日志格式: 101.38.166.177 – – [10/Jun/2016:14:19:19 +0800] “POST /wp-admin/admin-ajax.php HTTP/1.1” 200 1 ...