=<=1)的计算公式为 f=(end-z)/(end-start) 。 其 中 start 和 end 为 程 序 设 置 的 雾 的 起 点 和 终 点 ( 即 glFogf(GL_FOG_START,start); glFogf(GL_FOG_END,end);) 。最值得关注的是 z 的定义。我手头上有好几本 OpenGL 的参 考书,但介绍了雾的定义的却只有两本。在《OpenGL 编程实例与技巧》 (吴斌 毕丽蕴 编 著)中,他们认为“z 表示视点与图元中心的观察坐标之间的距离”。在《OpenGL 深入编程 与实例揭秘》 (彭晓明 王坚 编著)中,他们认为“z 是像素或顶点在眼坐标系中的 z 坐标分 量值 (总为负值) 在 VC++的联机帮助中说的是“Let z be the distance in eye coordinates from ”。 the origin to the fragment being fogged. ”。如果所绘制的物体不大(比如长和宽都为 1 个单位 的矩形) 那么上面所说的都可以近似为: 就是视点与物体在观察坐标之间的距离 , z (负值) 。 当绘制的物体很大时 (比如长和宽都为 200 个单位的矩形) 我认为上面的说法都值得探讨。 , 我认为 z 可能是“视点与绘制物体边缘在观察坐标之间的最近距离(负值)”,上次我绘制图 形时绘制了几个很大的物体,所以当我移动物体时,雾的效果并不是近处清晰,远处模糊。 我想如果把大的物体划分为很小的物体进行绘制,就可以解决问题。 问:请问画树时如何将树设置为透明格式? 答:可以使用融合的方法。 问:我在做一个虚拟场景时是用 Bezier 曲面拟合环境中的曲面,然后再贴以纹理,但我发 现这样极其占用系统资源, 而且我用了显示列表来处理。 我想请教一下有没有什么别的方法 来拟合曲面而不是那么占用
系统资源,或者是我的用法不对。 答:当然不能用 Bezier 曲面拟合环境中的曲面,Bezier 曲面需要大量的计算。最好的办
法是 直接获得曲面的顶点,采用 TRANGLES 或四边形来绘制。 问:我已经做好了一个视景,现在要做它的后视景,但是有个问题就是后视景并不能由前视 景简单的经过旋转 180 度得到(因为后视的原理是以镜平面对称) ,例如现在将视景绕 Y 轴 (视景坐标系)旋转 180 度,出来的效果是左边的物体到右边而右边的物体到左边了,所以 也不符合,现在想请教一下有没有比较简便些的算法来实现这个后视景问题。 答:这个问题不只是旋转坐标轴,而是镜面反射编程,你可网上有关编程示例。 问:我用 OpenGL 画曲面,原始数据通过打开数据文件获取,但为什么打开一个数据文件画
好后, 紧接着打开另一个文件再画时, 其形状和颜色都受第一次的曲面影响?为什么我的曲 面重画(刷新视区)后变成了坐标系中的平面?即各点 Z 坐标的值表面上看似乎变的相等 了? 答:显然你没有重新设置颜色。至于形状,检查坐标数组。检查 Z 轴坐标值。另外,注意 几何变换 PushMatrix 和 PopMatrix。 问:如何通过屏幕坐标获取物体三维坐标? 答:使用 gluUnProject 函数。 问:如何在 OpenGL 中将显示列表的文本用字体对话框控制? 答:在显示列表中就不能进行中间变化!用字体对话框控制字体,只能在显示列表之前。 问:导入 3D 模型文件为什么总是不能很好的倒入纹理贴图,有什么办法可以很好的导入一 个完整的 3D 模型文件? 答:这种情况一般都是由于纹理坐标错误。读带纹理 3DS 格式模型一般比较复杂,需要时 间理解透彻才行,暂时可以用材质(不含纹理)代替。借鉴网上一些
免费纹理模型贴图的示 例也行呀。 问:我的工程将视区分为两个后(加了一个 FormView 窗体,用于放一些控制图形缩放的控 件,这样它于绘图窗口共享原来的视区)为什么用 OpenGL 画的图不见了?我需要注意什 么?错在那里? 答:注意设置好象素格式。 问: 我自己绘的四边形片怎么原来有边框和界限即一个个的小方格,现在运行程序后突然 变成了一条没有任何界限的色带?程序片段如下: glPolygonMode(GL_FRONT,GL_FILL); 111 gl