感谢斑竹把我的帖子置顶:
这次的教程是
http://community.csdn.net/Expert/topic/3547/3547533.xml?temp=.8146631
的延续,本节的图文网页形式的连接地址是:
http://www.happytravel.com.cn/newsoft/opengl/2.htm
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 为物体穿上华丽的外衣

解决方案 »

  1.   

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

  2.   

    to  lyq81404(清风)  不可能吧,要不你到其他的地方再下载一个GLScene,www.playicq.com上就有
      

  3.   

    我下载了文件,可是安装的时候说我缺少cg.dll,为什么???
      

  4.   

    GLScene需不需要付费的????是打包好的DPK?
      

  5.   

    各位前辈好!前段时间,我也看了一下OPENGL,简单的东西也会做(光照、纹理帖图等),但是,想直接使用OPENGL提供的工具,实现一个东西却挺困难,不知道GLScene能不能解决下面这个问题:画一个简单的房子,有四面墙、屋顶、地板,(前面这些都不难,下面就难罗),四面墙上个画1个窗户,需要透过这些窗户看到房子里面!??(这个场景中,窗户是透明的,其他为不透明)
      

  6.   

    9494...
    我用MAYA做了一个F22飞机,可是怎样导入到GLScene里昵?
      

  7.   

    为什么安装时出现缺少cg.dll文件,怎么解决啊?
      

  8.   

    关于cg.dll是nvidia的开发包,下载地址:http://developer.nvidia.com/object/cg_toolkit_1_2.html
      

  9.   

    我安装好了,可是一使用就连delphi也关闭了,也看不到3d的物体,屏幕都是托拽的花屏
      

  10.   

    我在安装的时候总是说缺少glscenebcb6.bpi
    这是怎么回事呀?