glEnd();
该Bezier曲线是由30段line构成,我需要在场景中设置一个物体沿该曲线路径移动, 我怎么获得各个顶点的坐标值呢?反馈信息好象只包含窗口可见的顶点信息,有更好的办法吗?请赐教。
答:最直接的办法是你自己来计算(只是简单的Matrix变换)当然也是比较麻烦的;另外可以让OpenGL帮你算,方法是定出物体的坐标系沿着Bezier曲线移动后的新位置,这种移动可能不唯一(比如简单的平移或利用曲线的切平面和法平面来定义),所以你必须定出移动的规则,有了新的坐标系数据,可以gl相应的Matrix,就可以直接显示了,假如要求出实际的坐标(假如只是想显示是没有必要计算的),用Matrix去乘吧。
问:我现在碰到一个问题,就是用OpenGL来画出一个动态的海洋,波浪涌动。因为还要有船贴图似乎不行,而计算海平面的三维坐标值简直太麻烦了,巨量的点,复杂的法线...。最后一招,用3DS MAX画出来在加载进去,但格式转换也不轻易。我该怎么做呢?
答:这个问题其实可以用很简单的方法解决。可用一个简单的四边形或格网构成海面框架,然后进行海面纹理贴图,让纹理动起来,不就有动态波浪海洋的场景了吗。在海面上的船可以继续加,各种变换照常进行。
问:在用C++Builder编写OpenGL程序时,在Scene窗口中,用鼠标移动物体,能否有办法知道移动后物体所在的坐标位置?用鼠标任意旋转物体,怎样知道该物体的旋转角度和方向等数值。即:物体初始位于原点,怎样把鼠标移动物体的视觉效应转化为精确的坐标变换?
答:需要建立一个新的三维坐标系,将视点、图像投影面(Scene窗口)以及物体等,一起定位与这个坐标系里。当鼠标移动时,延长视点与鼠标屏幕点的连线,使其相交与物体移动的面(假定使用二维鼠标,物体在XY或YZ或ZX或球面上移动),其交点就是物体移动后的坐标点。旋转角度则根据前后两次位置不同,计算出相对于某个旋转中心(如视点、物体中心点或坐标原点等)的旋转角度。 问:MiniGL与OpenGL的内容有什么不同?
答:MiniGL只是OpenGL的一个外包装,在它的内部是根据当前的显卡来决定实际的OpenGL驱动(如PowerVR、3dfx、etc..),MiniGL实际并不实现任何OpenGL功能。
问:在编写OpenGL的纹理程序时,函数auxDIBImageLoad()打开文件时返回“文件打开错误”,我希望了解调入位图的具体方法。
答:1)在调用该函数之前必须确认调入的图象是BMP格式,而且宽和高是2的n次幂。
2)OpenGL中调入位图方法。OpenGL中调入位图作为纹理,要害是清楚位图文件的结构,对于Windows下的位图,一般从第54个字节处开始才是图形数据,下面是个例子:
int MakeTexture128(char *name,GLubyte Image[128][128][3] ) {
GLint index; FILE *fp;
int i, j, r,g,b;
fp=fopen(name,\if(fp==NULL)
{
fprintf(stderr, \}
fseek(fp,54L,0);
for (i = 0; i <128; i++) {
for (j = 0; j < 128; j++) {
r=fgetc(fp); g=fgetc(fp); b=fgetc(fp);
Image[i][j][0] = (GLubyte) b; Image[i][j][1] = (GLubyte) g; Image[i][j][2] = (GLubyte) r; } }
fclose(fp);
index =glGenLists(1);
glNewList(index,GL_COMPILE);
glTexImage2D(GL_TEXTURE_2D,0,3,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,&Image[0][0][0]); glEndList(); return index; }
问:在VC中创建OpenGL应用程序时,需要连接LIB目录中的opengl32.lib、glu32.lib、
glaux.lib这三个函数库。但我不知道该如何将这三个文件同我的程序连接起来,特请教。
答:可用二种方法:
1)在VC的Project->Setting->Link->Object/Library modules中加入这三个库;
2)在VC的Project->Add to Project->Files中加入这三个库。
3)在你的源文件任何一个地方加入 #pragma comment(lib,\#pragma comment(lib,\
同时,glaux.lib不推荐使用,推荐使用 glut 。包含 glut32.lib的库。同时请下载 glut 3.7 的运行库和头文件。
问:在OpenGL的一个完整的变换过程中,要经过一系统的矩阵变换,其中第一步是取景变换,或者叫视点变换。请问一个完整变换过程是否只能有一个视点?而这个视点的任何变换(取景变换)是否对于场景中所有模型均产生作用? 答:对于一个视口(Viewport)而言只能有一个视点。视点的变换是否对场景中的模型起作用,还要看投影变换。
转 十大OpenGL教程
2009-05-16 00:11
1.http://nehe.gamedev.net/
这个是我觉得全世界最知名的OpenGL教程,而且有网友将其中48个教程翻译成了中文http://www.owlei.com/DancingWind/。Nehe教程最大的特点是提供了针对不同平台、不同编译器、不同语言的各种版本。你不用考虑自己用的是Linux/Windows、VC/BC、C++/Java/C#/VB,甚至D语言,你都能找到对应的版本。除了这些教程,在Nehe
Productionshttp://nehe.gamedev.net/data/downloads/download.asp?letter=0-9你还能下载到各种很cool的Demo,相当多的一部分都提供源代码。 2.http://www.ultimategameprogramming.com/
有100个免费的OpenGL教程,内容涉及很多八叉树、BSP、Cg、GLSL、各种纹理映射技术等,还有OpenAL、Ray Tracing的教程。该网站还推出了一本教你制作游戏引擎的书《Ultimate Game Programming with DirectX》,暂时还没有中文翻译版。
3.http://www.codesampler.com/ ;
有关于OpenGL、DirectX的很多教程、而且还定时更新一些东西,不过最近该链接我打开不了,不知道暂时出了什么问题。 4.http://www.lighthouse3d.com/opengl/ 有针对View Frustum、GLSL、Math、Billboarding、Picking、Terrain、Display Lists、GLUT各专题的教程。其中关于GLUT、Terrain部分讲解都非常详细。一般的教程网站都是通过一段代码展示OpenGL的某种渲染效果,如果没有图形学背景很难理解其原理,该网站对所列每项技术的来龙去脉,相关算法都有比较详细的说明,会让你理解更加深刻。 5.http://www.gametutorials.com/ 我接触最早的一个OpenGL教程网站,有很多有特色的教程,比如一个小的2D RPG教程,可惜现在大部分代码都不能免费下载了。
6.http://www.ozone3d.net/tutorials/index.php ;
有关于OpenGL、GLSL、Direct3D的教程,还有很多其它有用的资料、工具下载,个人觉得很棒的一个网站。
7.http://www.swiftless.com/tutorials/opengl/opengltuts.html OpenGL、GLSL、DirectX、Physics、Math等相关教程,看着很不错。 8.http://www.morrowland.com/apron/tut_gl.php
教程的内容包含OpenGL基本变换、纹理映射等,也有一些有趣的Demo,可惜没有提供源码下载。
9.http://www.coolgroups.com/ 挺有特色的一个网站。
10.http://www.videotutorialsrock.com/
我知道的第一个OpenGL视频教程,可惜是全英文的,看视频教程还有一个好处就是不经意间能学到作者编程时的一些细小技巧。
补充
OenGL: 求法线(使物体表面平滑的顶点的法线)
#include \
#include
Vector3f::Vector3f(float x, float y, float z) { this->x = x; this->y = y; this->z = z; }
Vector3f Vector3f::crossProduct(const Vector3f &v) { float nx = y * v.z - z * v.y; // y->z float ny = z * v.x - x * v.z; // z->x float nz = x * v.y - y * v.x; // x->y
return Vector3f(nx, ny, nz); } /**
* Given three points in the order counter-clockwise. */
Vector3f calculateNormal(const Point3f &p1, const Point3f &p2, const Point3f &p3) {
Vector3f vector1(p2.x - p1.x, p2.y - p1.y, p2.z - p1.z); Vector3f vector2(p3.x - p1.x, p3.y - p1.y, p3.z - p1.z);
return vector1.crossProduct(vector2); }
Vector3f normalize(const Vector3f &v) {
float length = sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
if (length >= -0.001f && length <= 0.001f) { return Vector3f(0.0f, 0.0f, 0.0f); }
return Vector3f(v.x / length, v.y / length, v.z / length); }
如果是给组成物体的每个小平面都指定一条法线的话, 最后使用光照后得到的物体表面是faceted jewel(像有小面的珠宝似的), 使得物体表面不是平滑的. 解决这个问题的办法是给每个顶点指点一条法线, 而不是给每个小平面指定法线: 先计算每个小平面的法线. 然后再用这些面的法线来计算顶点的法线:
共享有这个顶点的所有小平面的法线的平均值就是这个顶点的法线(近似).
转: OpenGL API 简介
开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用C语言风格,提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律。所有OpenGL函数采用了以下格式:
<库前缀><根命令><可选的参数个数><可选的参数类型>
库前缀有gl、glu、aux、glut、wgl、glx、agl等等,分别表示该函数属于OpenGL那个开发库,从函数名后面中还可以看出需要多少个参数以及参数的类型。I代表int型,f代表float型,d代表double型,u代表无符号整型。例如glVertex3fv()表示了该函数属于gl库,参数是三个float型参数指针。我们用glVertex*()
来表示这一类函数。
OpenGL函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl 是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比