发布时间 : 星期日 文章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];