工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > Delphi > 正文
浅述Delphi下的OpenGL图形开发
[文章信息]
作者:wyb_star
时间:2004-09-02
出处:csdn
责任编辑:方舟
[文章导读]
本文将帮助你获得在Delphi中进行OpenGL开发的有效知识
advertisement
热点推荐
· 真没想到VB也可以这样用之指针技术
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
[正文]

上一页  1 2 3  

  3D历险

  好了,让我们开始真正的3D吧。将先前的代码作为框架,我们增加一些画线的代码建立一个带阴影面的四面体。应该如何用基本图形元素来构建呢?我们使用四个三角形。一个在底部,另外三个作为侧面。这里就是生成他们的代码:

procedure TForm1.Draw;
const D=1.5;
H1=D/1.732;
H2=D*1.732-H1; // D/H = tg(30) = 1/sqrt(3)
HY=3.0;
const //vertexes
a1:TGLArrayf3=(-D, 0, -H1); //bootom left
a2:TGLArrayf3=( D, 0, -H1); //bootom right
a3:TGLArrayf3=( 0, 0, H2); //bootom back
a4:TGLArrayf3=( 0, HY, 0); //top
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glTranslatef(0.0, 0.0, -12.0);
glBegin(GL_TRIANGLES);
glVertex3fv(@a1); glVertex3fv(@a3); glVertex3fv(@a2);
glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a4);
glVertex3fv(@a2); glVertex3fv(@a3); glVertex3fv(@a4);
glVertex3fv(@a3); glVertex3fv(@a1); glVertex3fv(@a4);
glEnd;
SwapBuffers(wglGetCurrentDC);
end;

  虽然看起来有点复杂,不过当你面对下面这张图时,它就很容易理解了。


  我们定义顶点a1 – a4同时依据4个顶点位置建立指定的三角形。当你定义自己的三角形(或者其他的多边形),请使用如下的规则:始终按照逆时针顺序排列定点序号,就像你正在外部观看侧面一样。通过这个规则,我们可以指定指定a1-a2-a4,a1-a3-a2(仰视),a2-a3-a4和a3-a1-a4。

  现在就替换Tri.pas中TForm1.Darw()部分,程序运行的效果不会体现出过多的变化。它看起来仍然不象三维图形。这是因为我们还没有设定任何光源。

  LIGHTS! CAMERA! OPENGL!

  在OpenGL中光源模式有两部分:光源自身(颜色,强度等等)和对象材质。材质,依次包括颜色,一些物理参数(比如不透明性光泽性)以及纹理。深入其中,这会是一个巨大的世界,我们将一步步地接近。

  定义一个光源相当容易。

procedure GLInit;
const
light0_position:TGLArrayf4=( -8.0, 8.0, -16.0, 0.0);
ambient: TGLArrayf4=( 0.3, 0.3, 0.3, 0.3);
begin
 // set viewing projection
 glMatrixMode(GL_PROJECTION);
 glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 25.0);
 // position viewer */
 glMatrixMode(GL_MODELVIEW);
 glEnable(GL_DEPTH_TEST);

 // set lights
 glEnable(GL_LIGHTING);
 glLightfv(GL_LIGHT0, GL_POSITION, @light0_position);
 glLightfv(GL_LIGHT0, GL_AMBIENT, @ambient);
 glEnable(GL_LIGHT0);
end;

  代码内的两个常量是必须的。一个定义光源位置(位于视点的后面的左上角),另外一个定义环境光线。这将产生少量的散乱光线,使你能够看到完全位于阴影中的某些物体。

  虽然你可以使用光照设定光源,可是物体仍然没有绘制阴影。这是因为OpenGL需要知道你指定的每个多边形的“normal”以便进行光线计算(Normal是一个与表面正交的向量) 。如果你没有自己的向量函数库,可以使用以下方法计算三角形中三个顶点的normal。这个函数是以定点逆时针排列为基础的,因为normal是一个向量的叉积,如果你不遵守该规则,会使向量指向四面体内部。

function getNormal(p1,p2,p3:TGLArrayf3):TGLArrayf3;
var a,b:TGLArrayf3;
begin
 //make two vectors
 a[0]:=p2[0]-p1[0]; a[1]:=p2[1]-p1[1]; a[2]:=p2[2]-p1[2];
 b[0]:=p3[0]-p1[0]; b[1]:=p3[1]-p1[1]; b[2]:=p3[2]-p1[2];
 //calculate cross-product
 result[0]:=a[1]*b[2]-a[2]*b[1];
 result[1]:=a[2]*b[0]-a[0]*b[2];
 result[2]:=a[0]*b[1]-a[1]*b[0];
end;

  使用这个函数,就可以设定所有的计算光线必需的信息了:

procedure TForm1.Draw;
const D=1.5;
 H1=D/1.732;
 H2=D*1.732-H1; // D/H = tg(30) = 1/sqrt(3)
 HY=3.0;
const //vertexes
 a1:TGLArrayf3=(-D, 0, -H1);
 a2:TGLArrayf3=(D, 0, -H1);
 a3:TGLArrayf3=(0, 0, H2);
 a4:TGLArrayf3=(0, HY, 0);
var n1, n2, n3, n4: TGLArrayf3; //normals
begin
 n1 := getNormal(a1,a3,a2);
 n2 := getNormal(a1,a2,a4);
 n3 := getNormal(a2,a3,a4);
 n4 := getNormal(a3,a1,a4);
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glEnable(GL_NORMALIZE);
 glShadeModel(GL_FLAT);
 glCullFace(GL_BACK);
 glLoadIdentity;
 glTranslatef(0.0, 0.0, -12.0);
 glBegin(GL_TRIANGLES);
 glNormal3fv(@n1);
 glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a3);
 glNormal3fv(@n2);
 glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a4);
 glNormal3fv(@n3);
 glVertex3fv(@a2); glVertex3fv(@a3); glVertex3fv(@a4);
 glNormal3fv(@n4);
 glVertex3fv(@a3); glVertex3fv(@a1); glVertex3fv(@a4);
 glEnd;
 SwapBuffers(wglGetCurrentDC);
end;

  这便是以上代码的效果:


  现在,使用一点Delphi VCL提供的的东西。在窗体上放一个Timer,指定一个类成员“angle:single”并在每次Timer触发时让他增加1:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
angle:=angle+1.0;
Draw;
end;

  离一个充满生气的OpenGL仅差条线:

glRotatef(angle, 0.0, 1.0, 0.0);

  把它放在glBegin()内三角开始绘制前的位置上,这样你的阴影部分就可以旋转了,至此,一切结束。



上一页  1 2 3  

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 深入理解Delphi的消息机制
  • Delphi处理SQL Server多媒体数据
  • Delphi中为RichEdit加入链接
  • 用Delphi7设计FTP上传软件
  • 利用Delphi编程控制摄像头
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • Advertisement