2.6 材质贴图 没有材质的物体是无法想象的,那么在GLScene中如何为物体穿上这层华丽的外衣呢?其实很简单!让我们在GLScene中几乎所有的物体都拥有Material属性。在场景编辑器中选择一个Cbue然后看看它的属性观察器,你看到了什么?图2.8中红色的部分就是它的材质属性。
图2.8物体的材质属性点击右边的…将会弹出材质编辑器,如图2.9
如图2.9 材质编辑器材质编辑器的最上方有三个选项卡,分别是Font,Back,Texture,其中Font,Back是根据各种不同的颜色值来调节材质。而Texture则是以贴图的方式来调节材质。当启用Texture模式时(Disabled:=false)Font和Back的设置将自动被屏蔽。如图2.10
图2.10 材质编辑器-贴图模式关于材质的具体用法将在后面的章节结合实例详细介绍。    第三章                GLScene实例 前面介绍了一些GLScene的基础知识,从本章开始我们将通过实例来进一步了解和认识GLScene。3.1  一个最简单的场景实例前面的章节虽然说了很多,但是自始至终我们都没有对GLScene有一个直观的,感性的认识,连运行一次程序的机会都没有。为了证实我们不是在纸上谈兵,现在请和我一起来:首先创建一个新工程,然后在窗体上依次添加如下控件,如图3.1
图3.1 空白场景在图3.1中那个灰色凹状的东西叫场景观察器(GLSceneViewer),太在GLScene控件选项卡中的图标为: ,是用来实时显示场景编辑器中物体状态和位置的可视化控件。它最关键属性属性就是Camera(摄像机),该属性用来连接场景编辑器中的摄像机,一个场景观察器同一时刻只能连接一个摄像机。一旦与摄像机连接成功,那么场景观察器中观察物体的视角就是当前所连接摄像机的视角。 双击窗体上的 控件,在弹出的场景编辑器中添加如下物体:如图3.2
图 3-2默认情况下添加在场景中的物体坐标都是:x=0,y=0,z=0 所以为了防止物体的重叠,我们分别给他们一个不同的坐标值。调整坐标值的方法请参考图3.3
图3.3现在我们设置GLCamera1的位置值为: x = 0 ; y = 5 ;z =  5 ;GLCamera1的TargetObject属性值为 :Cube1 ;Cube1的位置值为        : x = -1 ; y = 0 ;z =  0 ;Sphere1的位置值为    : x = 1 ; y = 0;z =  0 ;此时场景观察器中的情形应该同图3.4类似。
图3.4在DELPHI中按F9键运行程序,看到到的最后结果如图3.5
图3.5是不是有些失望,场景中的物体黑糊糊的。难道GLScene就这个水准吗?当然不是了,仔细想想我们是不是忘了什么呢?对了,我们没有给场景中的物体添加材质,也没有指定颜色,这当然不行了。好了现在我们给场景中的Cube1穿件外衣吧。在场景编辑器中选中Cube1然后在属性编辑器中单击它的Material属性右侧的按钮,在弹出的材质编辑器中任意给他加上一个颜色。如图3.6
图3-6同样给Sphere1也任意加一个颜色,不过场景观察器中灰色的背景让人看起来不太舒服,那就把它也改掉吧。如图3.7
图3-7现在看看场景观察器中的样子,天哪,好吓人呀,什么都没有了,呵呵别着急,在这漆黑的夜晚中我们需要一盏明亮的灯。在场景编辑器中添加一盏灯光,设置它的位置属性如下:x =0;   y = 8 ; z = 5 ;现在是不是情况不一样了呢?再次运行程序,我们应该看到与图3.8类似的情形.
图3-8好了,一个基本的场景就这样建立完成了。是不是很简单呀。现在让我们来回顾一下创建一个基本场景所必须的步骤吧:1、          添加场景编辑器和场景观察器。2、          在场景编辑器中创建并设置物体。3、          在场景编辑器中创建并设置摄像机。4、          在场景编辑器中创建并设置灯光。5、          运行程序。
 

解决方案 »

  1.   

    这里有个例子
    http://community.csdn.net/Expert/topic/3507/3507628.xml?temp=.6935694
      

  2.   

    怎么我在安装此组件时,提示GLscene.inc文件找不到,无法安装呀?
      

  3.   

    到这里下载http://www.happytravel.com.cn/newsoft/opengl/GLScene.rar
    或到source文件夹中查找GLscene.inc文件,并复制到安装文件夹下即可
      

  4.   

    不知怎么搞的昨天写的东西今天用WORD一打开发现都是乱码,连纯文本都提不出来,大家有什么好办法吗?
      

  5.   

    3.2  控制我们的场景   上一节我们介绍了如何创建一个简单的GLScene场景,但是那个场景实在是显得太单薄,我们无法从多个角度来观察场景中的物体,让人们感觉就是一幅简单的二维图画。本节我们就要解决这个问题,还3D场景一个真实面目。首先建立一个简单的场景,场景中的具体物体如图:3.9
    图 3.9其中GLLightSource1的属性设置如图3.10
    图3-10接下来是一个Teapot,它的的选取方式如图3-11
    图3-11Teapot1的属性设置为默认值即可。DummyCube1的属性如图3-12
    图 3-12GLCamera11的属性设置如图3-13
    图 3-13还有就是别忘了把GLSceneViewer1的Camera属性设置成GLCamera1。把GLSceneViewer1的背景颜色设置成黑色,这样效果能更好一些。如图3.14
    图3-14设置完成后的效果应该和图3-15类似
    图3-15好了,现在窗体设置部分已经完成,让我们进入激动人心的代码阶段吧。先来一段简单实用的,选中Form1,在它的OnMouseWheel(鼠标滚动)事件中添加如下代码:   GLCamera1.AdjustDistanceToTarget(Power(1.1, WheelDelta/120));运行程序,滚动鼠标滚轮看一看有什么效果!是不是有些惊讶!没错有了GLScene一切就是这么简单。虽然只有区区一行代码,但是它却实现了镜头的缩放功能,这一切都归功于函数AdjustDistanceToTarget。AdjustDistanceToTarget:摄像机的专有函数,它根据参数distanceRatio调整摄像机到目标的距离. 如果摄像机没有选择目标,该函数将不产生任何影响。该函数属于摄像机控制部分,它仅改变摄像机的位置。不要停,继续跟我写再写两段。在Form1的OnKeyPress的事件中添加如下代码:   with Teapot1 do case Key of       '7' : RotateAbsolute(-15,  0,  0);       '9' : RotateAbsolute(+15,  0,  0);        '4' : RotateAbsolute(  0,-15,  0);        '6' : RotateAbsolute(  0,+15,  0);        '1' : RotateAbsolute(  0,  0,-15);        '3' : RotateAbsolute(  0,  0,+15);   end;上面的代码实现的茶壶的旋转,其中使用的函数其实只有RotateAbsolute,那么现在让们来了解一些RotateAbsolute函数吧:procedure RotateAbsolute(const rx, ry, rz : Single); overload;函数包含三个参数,rx, ry, rz这三个参数分别对应物体的X,Y,Z三个轴上的做坐标值。RotateAbsolute可以应用于所有GLScene物体,使用方法为:GLSceneObject. RotateAbsolute.好了,运行程序,分别按下数字键 7,9,4,6,1,3 看看是不是有类似图3-16的效果了。
    图3-16还不过瘾,感觉太简单了是不是,那么下面我们就来个稍微复杂一点的。首先在程序的私有部分声明如下变量:mdx, mdy : Integer;    选中GLSceneViewer1控件,在它的OnMouseDown事件中添加如下代码:   mdx:=x; mdy:=y;在OnMouseMove事件中添加如下变量和代码:变量:var   dx, dy : Integer;代码:dx:=mdx-x; dy:=mdy-y;   mdx:=x; mdy:=y;   if ssLeft in Shift then begin      if ssShift in Shift then begin      GLCamera1.RotateObject(Teapot1, dy, dx);      end else begin                 GLCamera1.MoveAroundTarget(dy, dx)      end;    end;运行程序,先在场景中按住并移动鼠标左键。然后再按住Shift键重复上面的操作看一看有什么不同。GLCamera1.RotateObject(Teapot1, dy, dx);负责旋转指定的目标物体。这个旋转方式和Teapot1.RotateAbsolute是两种完全不同的意义,Teapot1.RotateAbsolute是物体本身真正的发生了变化,而GLCamera1.RotateObject是通过调整摄像机来达到旋转物体的效果,物体本身其实没有任何变化。RotateObject的函数定义如下:procedure RotateObject(obj : TGLBaseSceneObject; pitchDelta, turnDelta : Single;rollDelta : Single = 0);其中各参数含义如下:obj:旋转目标pitchDelta, turnDelta : 旋转系数;rollDelta : 滚动系数(默认为 0 );再看语句GLCamera1.MoveAroundTarget(dy, dx)这条语句负责以摄像机的目标为中心来移动摄像机。MoveAroundTarget的函数定义如下:procedure TGLCamera.MoveAroundTarget(pitchDelta, turnDelta : Single);其中各参数含义如下:pitchDelta, turnDelta:旋转系数。最后让我们看一下经过调整后的场景,如图3-17
    图3-17本节介绍了基本的场景控制方法,现在我们已经可以进行一些简单的动画设计了,从下一节开始我们将学习如何为我们的物体穿上华丽的外衣-材质设计。下面给出这个实例的完整代码以供参考:{:  这个例子演示如何通过摄像机来控制场景中的物体。  鼠标左键用来控制整个场景的观察角度。    鼠标滚轮用来控制摄像机视角的拉伸。  数字键        ‘7’, ‘9’ 在X轴方向旋转茶壶‘4’, ‘6’ 在Y轴方向旋转茶壶  ‘1’, ‘3’ 在Z轴方向旋转茶壶}unit Unit1; interface uses  Windows, Forms, GLScene, GLObjects, GLMisc, Classes, Controls,  GLWin32Viewer; type  Tform1 = class(Tform)    GLScene1: TGLScene;    GLSceneViewer1: TGLSceneViewer;    GLCamera1: TGLCamera;    Teapot1: Tteapot;    GLLightSource1: TGLLightSource;    DummyCube1: TdummyCube;    procedure GLSceneViewer1MouseDown(Sender: Tobject;      Button: TmouseButton; Shift: TshiftState; X, Y: Integer);    procedure GLSceneViewer1MouseMove(Sender: Tobject; Shift: TshiftState;      X, Y: Integer);    procedure FormMouseWheel(Sender: Tobject; Shift: TshiftState;      WheelDelta: Integer; MousePos: Tpoint; var Handled: Boolean);    procedure FormKeyPress(Sender: Tobject; var Key: Char);  private    mdx, mdy : Integer;    // 用来保留鼠标的X,Y轴状态  public   end; var  Form1: Tform1; implementation {$R *.DFM} uses Geometry, Math; procedure Tform1.GLSceneViewer1MouseDown(Sender: Tobject;  Button: TmouseButton; Shift: TshiftState; X, Y: Integer);begin    mdx:=x; mdy:=y;end; procedure Tform1.GLSceneViewer1MouseMove(Sender: Tobject;  Shift: TshiftState; X, Y: Integer);var   dx, dy : Integer;   v : Tvector;begin   dx:=mdx-x; dy:=mdy-y;   mdx:=x; mdy:=y;   if ssLeft in Shift then begin      if ssShift in Shift then begin//按住Shift键并拖动鼠标产生茶壶旋转的效果,实质是摄像机行为而不是茶壶行为。      GLCamera1.RotateObject(Teapot1, dy, dx);      end else begin// 拖动鼠标改变观察目标的视角(以目标为中心)          GLCamera1.MoveAroundTarget(dy, dx)      end;    end;end; procedure Tform1.FormMouseWheel(Sender: Tobject; Shift: TshiftState;  WheelDelta: Integer; MousePos: Tpoint; var Handled: Boolean);begin   // 设置目标与摄像机的距离   GLCamera1.AdjustDistanceToTarget(Power(1.1, WheelDelta/120));end; procedure Tform1.FormKeyPress(Sender: Tobject; var Key: Char);begin//控制茶壶旋转   with Teapot1 do case Key of       ‘7’ : RotateAbsolute(-15,  0,  0);       ‘9’ : RotateAbsolute(+15,  0,  0);        ‘4’ : RotateAbsolute(  0,-15,  0);        ‘6’ : RotateAbsolute(  0,+15,  0);        ‘1’ : RotateAbsolute(  0,  0,-15);        ‘3’ : RotateAbsolute(  0,  0,+15);   end;end; end. 3.3 为物体穿上华丽的外衣
      

  6.   

    本节文章连接地址:
    http://www.happytravel.com.cn/newsoft/opengl/2.htm
      

  7.   

    http://www.happytravel.com.cn/newsoft/opengl/2.htm
    中图片显示速度较慢,请耐心等候!
      

  8.   

    郁闷啊 我怎么装不上GLS_SDL7.dpk啊说少了bpl文件
      

  9.   

    郁闷啊 我怎么装不上GLS_SDL7.dpk啊 他说打不开bpl文件,少了某个库文件这是怎么回事啊?
      

  10.   

    中英文对照帮助:
    http://community.csdn.net/Expert/topic/3566/3566452.xml?temp=.1698572
      

  11.   

    例子网上到处都是,用google找嘛!