zoukankan      html  css  js  c++  java
  • 用Delphi+GLScene轻松打造3D场景、动画之GLScene基础

    (在基础类里发了一个,但是感觉更适合这里,所以在发一遍)
    前一段时间由于工作需要简单接触了一下DELPHI中开发OPENGL方面的知识,无意中发现了一个非常经典的

    控件GLScene,这个控件可能是DELPHI中最好的OPENGL控件了。不敢独享,现在把一些使用心得写下来,

    希望能对各位有所帮助。

    GLScene控件下载地址:
    http://www.happytravel.com.cn/newsoft/opengl/GLScene.rar
    大家也可以到WWW.GOOGLE.COM中下载,呵呵。。。
    本文的连接地址:
    http://www.happytravel.com.cn/newsoft/opengl/GLSceneforDelphi.htm
    第一次写教程希望大家能给点鼓励,关键的还是意见,呵呵!
    如果此贴有幸回复过百我将公布我翻译和修改的GLScene中文帮助。(其实也很烂)
                                                     凌  风
                                                   E-MAIL:DONG_TENG@TOM.COM
                                                   QQ:10778552 验证:CSDN 
                                                   2004.11.12
                                                 

    ------------------------------------------
                             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 obot.3ds');

  • 相关阅读:
    H5+ 分享到微信、朋友圈代码示例
    H5+ 重写在线升级版本比较代码
    H5+ a页面打开b页面,b页面加载成功后关闭当前页面,闪屏的规避解决方案
    MUI
    MUI
    MUI
    MUI
    Vue实战之【企业开发常见问题】
    step1:准备歌词之《前端开发是个啥》
    element-ui级联选择器(Cascader)获取级联对象 (主要是想获取:label值)
  • 原文地址:https://www.cnblogs.com/shsgl/p/5710830.html
Copyright © 2011-2022 走看看