感谢斑竹把我的帖子置顶:
这次的教程是
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 为物体穿上华丽的外衣
这次的教程是
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 为物体穿上华丽的外衣
我用MAYA做了一个F22飞机,可是怎样导入到GLScene里昵?
这是怎么回事呀?