OpenGL ES教程十二 联系客服

发布时间 : 星期日 文章OpenGL ES教程十二更新完毕开始阅读d4baf1305a8102d276a22fda

3D中的运动

现在你又把握处理gluLookAt(),让我们用它来模拟在地板上行走,我们只能移动(X,Z),也就是说,不要移动y,就是高度。

所以,思路会到gluLookAt(),想想,在3d世界中移动,你需要什么信息? 你需要:

你观察的位置或者说眼 你面向的位置或者说“中心”

一旦你知道了这两项,你就要准备好用户输入,以让用户控制移动。

设置以下变量来改变眼睛及中心

GLfloat eye[3];// Where we are viewing from GLfloat center[3];// Where we are looking towards

回到 initWithCoder: 在调用 gluLookAt()之前,初始化下:

eye[0] = 5.0; eye[1] = 1.5; eye[2] = 2.0;

center[0] = -5.0;

center[1] = 1.5; center[2] = -10.0;

到 drawView: 调用 gluLookAt():

gluLookAt(eye[0], eye[1], eye[2], center[0], center[1], center[2], 0.0, 1.0, 0.0);

为运动做的准备

在我们开始执行触摸事件并在世界中移动之前,我们需要在头文件中设置一些东西。来到头文件,我们需要创建一个新的枚举类型。

首先,设置我们的步行速度及转身速度:

#define WALK_SPEED 0.005 #define TURN_SPEED 0.01

下一步,我们创建一个枚举,来表示我们正在做什么,如下:

typedef enum __MOVMENT_TYPE { MTNone = 0, MTWalkForward, MTWAlkBackward,

MTTurnLeft, MTTurnRight } MovementType;

所以,在我们运行app的时候,我们可以一直是站着,或者前面,或者后退,或者转左,或者转右。

最后,我们定义个变量保存但前的运动状态:

MovementType currentMovement;

别忘了到 initWithCoder: 函数里面去设置 currentMovement 的默认值:

currentMovement = MTNone;

获得触摸

好的,我们已经进行了基本的介绍,让我们开始实际的处理工作。如果你还记得我之前的教程,你应该知道触摸状态四种,今天我们使用 touchesBegan 和 touchesEnded.

为了确定行动的种类,我们把屏幕分为四部分。

开始进行触摸的函数:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch *t = [[touches allObjects] objectAtIndex:0];