基于Android的三维物体的触摸控制

时间:2022-09-02 12:29:50

【前言】基于Android的三维物体的触摸控制由文秘帮小编整理而成,但愿对你的学习工作带来帮助。一、如何选中三维物体 OpenGL ES并没有像OpenGL一样提供有选择模式,因此需要自己去实现选中物体。 算法思路:作一条直线,该直线经过屏幕上的触点并且与屏幕垂直;求出该直线在世界坐标系中的方程,然后再判断该直线与三维物体是否有交点,如有交点,则选中该物体。 下面以...

基于Android的三维物体的触摸控制

[摘要]Android平台是手机界的一股新生力量,它是完全免费并开源的,在Android上主要使用OpenGL ES来进行3D开发。因此,将探讨在3D场景中如何实现对三维物体的触摸控制,比如如何选中,移动,旋转等,并给出一个比较高效的选中物体的算法和一个简单实用的旋转物体的算法,以及在此基础上开发一个简单的魔方游戏,游戏程序在:sites.省略/site/quillchan/android。

[关键词]AndroidOpenGL ES触摸控制三维选中三维旋转

中图分类号:TP2文献标识码:A文章编号:1671-7597(2009)1210091-01

Android是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序――移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。

android上主要使用OpenGL ES来进行3D开发。OpenGL ES(OpenGL for Embedded Systems)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。Android 1.5中带的是OpenGL ES 1.0版本,它是以OpenGL 1.3规范为基础的。本文将对3D场景中物体触摸控制进行研究,并给出实现的算法。本文所做的论述都是基于Android 1.5,OpenGL ES 1.0。

一、如何选中三维物体

OpenGL ES并没有像OpenGL一样提供有选择模式,因此需要自己去实现选中物体。

算法思路:作一条直线,该直线经过屏幕上的触点并且与屏幕垂直;求出该直线在世界坐标系中的方程,然后再判断该直线与三维物体是否有交点,如有交点,则选中该物体。

下面以立方体为例(不规则的三维物体都可以转化为规则物体来操作),来说明一下算法的具体过程。设(x,y)为触点的屏幕坐标,则得到视点坐标为(x,windowHeighty),记作(winX,winY)。分别给该点配上深度坐标,得到两点A1(winX,winy,0),A2(winX,winy,1)。通过gluUnProject转化到世界坐标,得到世界坐标系下一条直线的两点:

GluUnProject(A1)-->S2(Sx2,Sy2,Sz2)

GluUnProject(A2)-->E2(Ex2,Ey2,Ez2)

现在问题就剩如何求直线与立方体的交点了。立方体一共有六个面,建立模型的时候顶点坐标都是已知的,因此可以得到立方体每个面的空间方程表示,再分别求出每个面与直线的交点。

1.设平面上3点为ptA,ptB,ptC;构造一个平面:

plane(ptA,ptB,ptC)。

2.再根据两点构造一条直线:

line(S2,E2)。

3.求出交点:

crossPoint=cross(plane,line)。

4.再判断该点是否在相交平面的正方形内(点到正方形两对边的距离之和如果大于边长,则该点在正方形外部),如果是,说明选中了该物体。

5.为了提高效率,可以先判断立方体都有哪些面朝向屏幕外侧,然后再计算这些面与直线的交点就可以了。方法如下:由两点S2,E2得到一个向量E2->S2(朝向屏幕外侧),分别求该向量与立方体各个面的法线(方向朝外)的夹角,如果夹角小于90度,说明该面朝向屏幕外侧,进而判断直线与该面的交点是否落在这个面上。

先求平面朝外的法向量,设平面上的三点ptA,ptB,ptC(点的顺序要按照右手法则):normal=(ptBptA)X(ptCptA)(X代表向量叉乘)。

再求E2->S2和法向量的夹角余弦值,如果余弦值大于零小于一,说明夹角小于90度,该面朝向屏幕外侧。

二、如何旋转三维物体

三维空间的旋转有三个自由度,大家自然会想到使用三个对应于三条坐标轴的角度去记录,即:

GlRotatef(ax,1,0,0)

GlRotatef(ay,0,1,0)

GlRotatef(az,0,0,1)

这就是我们通常所说的Euler Angle方法。但是这种方法存在一个万向节死锁的问题。

如何来避免万向节死锁呢?实际上数学上有种偏轴角(Axis Angle)的定义。先定出两个旋转向量,然后求出他们之间的最少旋转角度,再绕这两个向量的法线旋转该角度即可。由于每次只绕一个固定的轴旋转,因此并不会产生万向节死锁的问题。

这里我自己实现了一种类似于偏轴角的旋转定义,但是比偏轴角的方法更符合用户在屏幕上的旋转操作。方法是通过将触点映射到三维坐标上,对前后相邻的两个触点(手指滑动形成)作一条直线,该条直线和垂直于屏幕的另一条直线形成一个平面,该平面的法线即是物体的旋转轴,再通过触点的位移得到合适的旋转角度,把物体绕该法线旋转即可。

记手指在屏幕上滑动形成的向量为V0;垂直于屏幕向外的向量为V1;则可得到旋转轴:

axis=cross(V0,V1)

记手指在屏幕上滑动的距离为ds;通过设定屏幕大小和角度的比例因子TOUCH_SCALE_FACTOR,得旋转角度:

angle=ds*TOUCH_SCALE_FACTOR

从而对物体进行旋转glRotatef(angle,axis.x,axis.y,axis.z)。

三、结论

触摸控制对于目前流行的3D游戏和3D桌面的开发都具有十分重要的意义,3D开发者们根据本文对触摸控制所做的分析可以很好地理清思路,避开一些因为平台不同碰到的琐碎问题,节省开发时间。本文针对立方体这个特例在选中和旋转物体的时候提供了高效的算法,也可以为别的规则的空间模型提供一个参考,具体的算法实现起来不同,思路大同小异。

参考文献:

[1]Foley van Dam,Feiner,Hughes.Introduction to computer graphics [M].[s.1.]:Addison-Wesley Publishing.

[2]Dava Shreiner,OPENGL编程指南[M].北京:机械工业出版社,2008.

[3]Samual R.Buss,3D计算机图形学(OPENGL版)[M].北京:清华大学出版社,2006.

作者简介:

陈建伟,硕士,主要研究领域:手机嵌入式系统,Android应用开发。

上一篇:VPN技术在社区卫生服务网络系统的应用研究 下一篇:基于GIS水文地质信息系统的研究