http://topic.csdn.net/t/20041112/15/3547503.html
GLScene基础 在开始使用GLScene之前先让我们了解一下GLScene的基本构成。一个GLScene场景由以下几个基本物体构 成: 1. 基本场景 2. 摄像机 3. 灯光系统 4. 基本物体 5. 辅助物体 6. 材质贴图 7. 场景观察器 2.1基本场景 在GLScene中是以场景为基本构成对象。场景是所有其它物体的父容器,我们所构建的所有可视物体或特 效都将在场景中显示。 场景由GLScene(场景产生器)产生,一个工程中可以有多个场景产生器,也就是说一个工程中可以同时 拥有多个场景。下面让我们来看一下如何产生一个场景,双击中GLScene控件栏的 ,这时会在窗体中显示 出一个 控件。表示我们已经成功的引进了一个场景,不过此时的场景中没有任何物体。我们继续在窗体 中的 上双击鼠标左键。此时将会弹出场景编辑器: 图2.1 场景编辑器 通过对象查看器我们可以: · 创建摄像机 · 创建或导入我们需要的物体 场景编辑器由工具栏和工作区两部分组成,我们的绝大多数操作都会在工作区中完成。 2.2 摄 像 机 摄像机是察场和用户之间的视觉接口,用户只有通过摄像机才能观察场景中的内容。 创建摄像机 在场景观察器中选中 ,然后单击鼠标右键弹出场景编辑器快捷菜单,其中添加摄像机(Add Camera)选 项将被激活,单击该按钮系统中将会添加一台摄像机如图2.2 图2.2 添加摄像机 摄像机关键属性 · CameraStyle / 摄像机类型 决定摄像机的类型. 共有如下四个选项 : 透视摄像机,成像图为透视图(默认选项)。 直角摄像机,成像图为直角图像。 平面设想机,成像图为2D效果,仅存在XY轴的概念。 自定义摄像机,你可以自由设置参数。 · DepthOfView / 景深 确定摄像机的景深。 影响当前摄像机的最大观察距离,超过这个距离的场景将被剪切(不可见). 该属性仅在Z轴上产生影响,一般景深的默认值为100 . 注意在2D模式中该属性将不起作用. · Direction / 方向 该属性确定摄像机镜头所在的方向,由X、Y、Z三个轴共同作用,且这三个方向上的值均为浮点类型,最 大取值为1最小取值为-1 。 · FocalLength / 焦距 定义摄像机的焦距。 调整当前摄像机的焦距(调节过度会使图像显示走样). · SceneScale / 场景缩放 缩放摄像机中的场景。 在2D场景中产生的线形缩放,相当于调整景深的效果。 · Position / 位置 该属性确定摄像机镜头所在的方向,由X、Y、Z三个轴共同作用,且这三个方向上的值均为浮点类型。 · TargetObject / 成像目标 设置摄像机所指向的目标物体. 当为摄像机选择一个目标物体时摄像机本身的方向性将被忽略,它将始终指向目标物体。 · NearPlane / 近景 获得当前摄像机的视角值。 返回值由当前摄像机的景深和焦距决定。 2.3 灯光 和现实世界一样GLScene中也需要灯光来照亮场景中的物体。灯光的设置和大程度上决定了场景 效果。 一个OPENGL场景中最多支持8盏灯光(实际上和OPENGL的版本和机器配置有关)。过多的灯光将 使渲染 速度降低。请慎重使用 。 创建灯光 在GLScene场景编辑器其中选中场景物体(Scene object),然后单击鼠标右键,场景编辑器快捷菜单此 时添加物体 (Add object) 选项将被激活,单击该按钮系统中将会弹出其子菜单,选择第一项( LightSource)。如图2.3 一盏灯光将会被加入到当前场景中。如图2.4 图 2.4 添加灯光 灯光属性 · Ambient / 环境色 获取或设置周围环境的颜色 。 · ConstAttenuation / 衰减常量 获取或设置灯光的衰减量。 · Diffuse / 散射光颜色 获取或设置漫反射的灯光颜色 。 · LinearAttenuation / 线形衰减 读取或设置灯光的线形衰减值 。 · QuadraticAttenuation / 二次方程式衰减 读取或设置二次方程的衰减值 。 · LightStyle / 灯光类型 获取或设置灯光的类型 。 灯光类型包括 lsSpot 聚光灯 , lsParallel 平面灯 ,lsOmni 泛光灯。 · Shining / 灯光强度 获取或设置灯光的强度 。 · Specular / 镜面效果 获取或设置境面效果 。 · SpotCutOff / 投射范围 (聚光灯) 获取或设置灯光的投射范围 。 · SpotDirection / 投射方向(聚光灯) 获取或设置聚光灯投射的方向 。 · SpotExponent / 投射指数(聚光灯) 获取或设置聚光灯的投射指数 。 2.4 基本物体 场景中有了摄像机和灯光只是搭建了一个最基本的平台,而我们主要最关心则如何是向这个平台中添加物 体,使其丰富起来。 GLScene 中提供了一些内置的基本物体供我们使用,这些物体的使用方式大体相同,以下仅举一例(CUBE) 来说明,以达到抛砖引玉的作用。 2.4.1 创建CUBE 在场景编辑器中选中场景物体(Scene Objects)选项,然后单击鼠标右键,在弹出的场景编辑器快捷菜 单中选择”Basic geometry->Cube” ,如图2.5所示: 图2.5 创建Cube 此时一个Cube将被加入到场景编辑器中。如图2.6所示。 图2.6 加入了Cube的场景编辑器 2.5 辅助物体 有时依靠GLScene中提供的基本物体,及建模方式是无法达到我对们的要求,比如复杂建筑物,带有动画 效果的动画角色等等。为了解决这类问题GLScene为我们提供了大量的辅助物体控件。以下简单地介绍两 个经常使用地辅助控件: 1. DummyCube 虚拟容器 该控件在默认情况下属性为不可见,即使将其VisibleAtRunTime属性设置为True,在运行时它也仅仅是显 示为一个虚线框。 DummyCube通常用来当成一个容器,将一个或多个控件包装成组。如图2.7: 图2.6 加入了DummyCube的场景编辑器 此时包含于DummyCube之中的控件将以DummyCube的坐标作为参考坐标,不在以场景的根坐标作为参考坐标 。与此类似任何包含与另一个容器(GLScene中的任何物体都可以作为容器)中的物体均以新的容器的坐 标作为参考坐标。 2. Actor 动画容器 这是一个专门用来导入处理动画角色的容器,你可以在其它工具中生成动画,然后通过该类来进行操作控 制。十分简单方便 。添加Actor的方法如图2.7 图2.7添加Actor Actor的用法通常如下: Actor1.LoadFromFile('test.md2'); // 读取动画文件 。 Actor1.Material.Texture.Image.LoadFromFile('test.jpg'); // 读取动画贴图 。 Actor1.Animations.LoadFromFile('test.aaf'); // 读取动画控制文件。 Actor1.Scale.SetVector(0.04, 0.04, 0.04, 0); // 根据实际要求缩放动画。 其中test.md2为一种动画格式。test.aaf为控制test.md2动画的控制文件。格式如下: ―――――――――――― AAF 20 站立,0,39 奔跑,40,45 战斗,46,53 …… ―――――――――――― 文件的第一行AAF标识该文件为AAF控制信息文件。 文件的第二行20表示该文件共由20个不同的动画动作组成。 第三行表示从第0帧到第39帧为站立动画。 第四行表示从第40帧到第45帧为奔跑动画。 其它与此类似。 掌握了该文件格式的含义我们就可以制作我们自己的动画控制文件了。 说的这么热闹,我们该怎么在GLScene中控制我们的动画播放指定的动作呢?起始很简单: Actor1.SwitchToAnimation(moving);其中moving就是动画AAF文件中的动画名称,比如moving:= ‘奔 跑’就表示当前将只播放动画中的奔跑动画部分,其它的则不予理睬。 Actor有如下几个重要属性,具体用法将在后面章节的中详细描述: StartFrame / 动画的初始帧 EndFrame / 动画的结束帧 Reference / 动画参考模式 CurrentFrame / 当前帧 CurrentFrameDelta / 下一个动画的表示区域 FrameInterpolation / 动画的表现方式 AnimationMode / 动画播放模式 Interval / 动画的播放速度 Animations / 动画播放列表 3. FreeForm 自由物体容器 FreeForm可以加载矢量文件比如(.3ds等),但是不能为动画文件。这样我们可以在专业的3D制作文件中 创建复杂的场景然后导入到GLScene中使用。它的用法如下: FreeForm1.LoadFromFile('images/robot.3ds');
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、 运行程序。