« 基于亮度的图像二值化处理Shader快速复习:Reflection And Refraction(反射与折射) »

一年前,首次献给OpenGL之夜.雷达追踪

清明节的法定假期,2008年是第一次吧?

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/Way/first-opengl-night-reida.html

一年前的清明节假期,我心中的世界注定多了一个角落。那里是计算机图形学,更是OpenGL的领地。恩,就是在那里感觉到了,另一种存在着的感觉。

记得那周最后一门课是周四的计算机图形学,教的是三种简单相机模型。因为很多学生要赶车回家扫墓,因而老师也提早了下课,貌似只上了两节左右吧。当然,我也是其中之一。回家后,就要去完成第二次课程作业了啊,上课后居然有点为作业而兴奋了,为什么呢?从来也没有过的跃跃欲试的感觉。

一个人走在通往地铁站的路上,老师骑着一辆“小小”的自行车从身旁经过,留下一个看手表的身影。

回家后,居然马上就开电脑开VC6了,呀,果然铁是趁热打的好,现在想来如果当时脑袋没发热,我大概会先去狂上网一段时间吧,然后做作业的兴致会渐渐消减,最后马虎收场。——幸好当时还有余温。

作业的要求是“在上一次做过(或有些学生没做过)的雷达程序上,加入雷达的转动,雷达针尖端置一闪动的点,且尖端指向一架飞机,就是说,飞机也得绕雷达塔转动。此外,实现一种相机模型”。姑且说这是雷达追踪程序吧,简单绘制的“飞机”我已经有了(见此[遇上OpenGL,一年] ),雷达塔我没做(而是做成了显示器),但此之前的那个星期我也画出来了,加上网格表示的地面。所以我要完成要求的话,只差两者位置摆放,以及相机模型的实现了。(旋转只是些glRotate,闪动也只是简单的时钟TIMER弄的“动画”[或者直接没狰更新嘛,现在的想法])

这天课上说的简单相机模型3种,第一种太傻冒了,第三种太难了,于是选第2种来实现。这一实现,就是三角函数复习,空间应用之类的数学一堆,还好知识没全忘记,加上不断调试,终于在晚上实现出来了(模型概述见下面程序说明),还好,不算太晚。明天周五再搞一会儿就完成了吧,乐了。

结果第二天我就放弃了这个念头。既然这周末除了周日早上扫墓也没其他什么事情,何不把这个作品弄好一点呢?反正我心中就有了这么一幅图像(什么图像?可以打开我下面给出的程序来看看画面哦)......好!决定了。

首先是指针的颜色,我希望是光束聚焦的效果。其次,我希望雷达指针一开始不打开,而是一开始空转,“发现了飞机”再打开。其三,我希望指针开启后会像Dragon Ball里那样,光束聚焦形成一个灵动的光球。恩...用来发射。其四,光球外面还有转动的光线哦。其五,恩,当然是发射了,发射光束,帅呆了。其六,诶?飞机是被雷达指针时刻指着的,那样如果飞机被射了,不就肯定中招了哦?这时候接下来不就没戏咯?好吧,我让雷达每次射击的时候,飞机都侧航一个角度来避开光束。噢噢,这一切对当时的我来说是不容易的哦,其实最不容易的还是视觉效果——光球,光线圈,光束要好好看才行哦!于是,时间到了周六晚上。

恩,看起来有模有样了,开心,像上次作业一样简单加个光源吧,有明暗效果咯。时间还有一天呢。怎么花费呢?好吧,给个“终结”它。就像Dragon Ball里的坏人被迫到死地的时候放大必同归于尽。这里雷达每次发射能量光束都打不中这架死飞机,想必它也怒了吧,怒到底无奈地,来来来,同归于尽吧:光球开始坍缩,坍缩到一点后再扩张开来的,就是一个黑球了!黑球如黑洞般无限扩大,淹没了自己,也淹没了飞机,淹没了大地(喂,不是网格咩).......然后,然后?TO BE CONTINUED!

这一步涉及改动原来光球代码之类的,还想做出地震效果(其实就是照相机上下摇摆 - -),然后我是在周日上午清明扫墓后回来,2点多后3点多才弄成的。好,整理代码。说是整理,对于当时的我来说不过是给不同的部分分一下分到不同的函数里而已。然后又通过改相机模型参数,实现视觉转换,一个是“飞机看雷达”的视觉,一个是“雷达看飞机”的视觉。完成。恩,晚上的时间怎么花费呢?

我想继续。

应该还可以做得更好的。

我看了NEHE例子中有一个分视窗的,就是把OPENGL的渲染窗口分成四部分。于是我仿照那个例子的代码做了,希望四个窗口中,有一个是全局视觉,就是观察者在高处看场景,能看到整个场景;另一个则用作刚才弄的“雷达/飞机视觉”;下一个放入上次作业画的雷达显示器;最后一个改gluPerspective为glOtho看看正投影下的场景是怎么样子的。各个视窗里的东西都没难度,不过改改参数绘场景而已。到底是分视窗难啊,我按NEHE代码写,结果运行的时候花屏!撤消操作后居然还是如此!如此RP?变不回出事之前?更RP的视然后又不小心按了VC6的关闭按钮.....再打开时已经无法继续撤消了,花屏还是这样.......

我怀疑是“工程”坏掉了,于是又把工程转到另一工程,还是如此。我上网按症状查询,没找到答案(现在看来是我根本不懂这种症状该怎么描述,关键词不对)。继续看NEHE代码,摆弄自己的代码,还是这样,基本崩溃。当初没有这个“馊主意”该多好啊,尽量把程序改到下午那样子啦......

可是,我下不了手。一晚的工夫,这样白费了值得吗?毕竟应该只是我在哪个小地方没有注意到啊。

夜深了。

这就是熬夜。为了OpenGL第一次熬夜。我再仔细观味NEHE的代码,调来调去,甚至是漫无目的地调、尝试.......终于,那么一瞬间,眼睛闪了。可以了!不花屏了!四个视图和谐共存!哎呀,到底实质是哪里问题都不知道呢。就这样停止了好吗,已经完结了不是吗?已经做出好成品了不是吗?已经自我感到满意了不是吗?

我还是.....即使困,我还是想知道原因。

于是我复制了一下工程(这次不那么笨了),然后再改代码,每次在原基础上只改某地方......一段时间后,知道了。是一个场景绘制前glClear的代码。glClear的代码放在默认渲染那里,也要放在分割视窗的第一个视窗前,大概因为这是两种模式(一种正常模式,一种分割模式),两种模式要同样对待吧......(现在看来,这很理所当然,呵呵,安慰一下过去的自己)。

恩,凌晨4点多了吧,明早7点多要赶回学校上课呢。我整理好凌乱的代码,在窗口标题那里写些“操作方法”后,终于睡觉了。

结果第二天早上那课,啊,精神状态抱歉了。中午没吃饭跑回宿舍睡觉。晚上到机房给程序里的雷达显示器弄些标记,写注释,再一天的晚上继续写注释。好,交吧。

-----------------------------------------------------------------------------

啊,真是冗长的回忆。看看我的第一个成型的拙作程序吧?下期再见。

程序控制:
左击-    开启雷达
[1.漫游←↑↓→UP DOWN]  ,分别表示左/右转,前进/后退,上仰/下俯
[2.暂停Space;再启Insert]
[3.飞机视角A; 雷达视角S; 返回观察视觉D; 视区开关Z&X] ,按X退出后按D回去观察视觉
[4.攻击Home 结末End]

程序截图:


雷达追踪DEMO   www.zwqxin.com
(普通视觉)
雷达追踪DEMO   www.zwqxin.com
(光球,闪动的内核)
雷达追踪DEMO   www.zwqxin.com
(射击)
雷达追踪DEMO   www.zwqxin.com
(雷达视觉)
雷达追踪DEMO   www.zwqxin.com
雷达追踪DEMO   www.zwqxin.com
(四视区)
雷达追踪DEMO   www.zwqxin.com
(毁灭- END同归)

代码是过程式的,可以认为是C语言出品,无视之可也
reida3DemoBYZwqXin.rar

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/Way/first-opengl-night-reida.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

IE下本页面显示有问题?

→点击地址栏右侧【兼容视图】←

日历

Search

网站分类

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2008-2013 ZwqXin. All Rights Reserved. Theme edited from ipati.