前两篇教程写的很仓促,最近又被很多工作缠住,最近才开始给大家带来新的这篇教程。首先向大家道歉。下面言规正传,前面给大家介绍过在JSR-184中物体的创建、移动、旋转。今天我们来说说,更为有用的东西——碰撞检测。不过看过文章后也许你会失望,因为今天我没有给出一行代码,也没有讲解pick()的用法。但是我想要说得是:为了减小系统的开销有些事情是需要我们自己做的。就像碰撞检测并不一定需要系统去做。但是稍候我给大家讲解pick()的用法。
在2维游戏中我们也经常要用到碰撞检测,所以大家都知道45度视角的游戏要比普通横版或竖版游戏更复杂一些,这也是为什么45度视角游戏被称作2.5D游戏的原因。而今天我们要讨论的3D游戏似乎就更复杂了。
别着急让我们来化繁为简,我们现在先来看一个简单的例子。
假设一个物体在一间四壁封锁的屋子里,这个屋子门是紧闭的。不存在物体能从屋子里出来,也不存在物体会跳跃(或者我们假设屋子的天花板是无限高的)。这样一个情况谁都能说出无需碰撞检测,只要限制物体在XZ平面的坐标不超过墙的范围就可以了呀。没错就是这样,我们现在来看图。
图1
图1为上面所描述的3D场景的俯视图。很明显我们只需要显示物体移动的范围的坐标值不要超出墙体的范围就可以了。这确实不需要碰撞检测,不过可不要小看这一思考方式,我下面会告诉你个设计思路就是由他派生出来的。
图2
在图2中我给出了6个图片,假设白色区域是一个赛车的赛道,黑色区域是非行驶区域,那么我们别把6个区域单独拿出来,按照上面所说的法则去限制赛车的移动,是非常简单的对吧,例如左上角第一张中,我们值限制赛车的X坐标在赛道之间就可以了。现在我们试想一下如果我把这些区域块拼接起来是不是就可构造成一个简单的赛道,当然这里只有直角弯存在,不过已经可以构造出赛道了对吗?同时记录每个区域块所对应的坐标,作为偏移量直接加减到限制条件中;或者赛车不真正移动,只是简单的把赛车从一个区域移动到另一个区域,怎么样?很简单吧?者种设计思路最简单哦,也是最实用的一种。
这个方法虽然很实用,但他有一个很严重的缺点。也许你已经发现了,那就是在拐角处只可以是直角,否则很难判断。那是不是有更好的方法来解决这个问题呢?答案是肯定的。不知道您是否听说过BPS树算法。也许有人要告诉我,那是渲染静态景物用的,这里他有什么用?别着急我们先来简单了解一下BPS树的原理,在BPS树中空间被墙体所在的直线分解为两部分,一部分是墙的前面,一部分是后面,当通过某一点确定摄像机位置后,只渲染墙体正面是对着摄影机的部分墙体。现在思路回来,要移动一个物体,如何判断是否和墙体有碰撞。假设碰撞不存在,物体是任意移动的,如果移动的起点和重点分别在墙的两侧,及分别在墙的正面和反面,结论很简单移动路线和墙体发生交叉了。这样的情况不就是碰撞了吗?现在我们来复习一下数学知识以便我们来分析如何判断物体在墙的片面还是背面
图3
如图3所示,黑线将空间分解为A、B两个部分,假设图中红线为黑线的法线。我们暂定A空间为黑线的正面。现在以o点为起点b点和b’点为终点(b点为正面任意一点,b’为背面任意一点)分别做两条向量,不难法线ob向量与法线向量的夹角永远不可能大于90度,而ob’向量和法线向量的夹角永远不肯能小与90度。这样一来我们很块就能明白某一点是在物体墙体正面还是背面了。也许您会问,如何得到该夹角呢?
在上面的描述中反复的出现的一个次就是向量,现在我们来用向量解角度问题。正如上面说到的,我们只需要判断前面还是背面,那么我也只需要判断是锐角还是钝角。锐角和钝角一个标志性的区分就是他们cos值的取值范围。锐角是大于0的,而钝角恰好是小于0的。向量的点积不恰好是两个向量的莫的乘积乘以向量夹角的cos值吗?而两个莫的乘积必然是大于0的,那么我们就可以通过ob向量和法向量的点积来判断点b是在正面还是背面了。另外向量的点积的运算也很简单
U.V=UXVX+UYVY+UZVZ=|U||V|cosθ
瞧,有了向量后我们只需要简单的3个乘法2个加法就判断出了物体在墙的正面还是后面。
说到现在我只是想给大家一些思路,所以到目前为止我并没有给出一行代码。因为我觉得这次的讲解主要是在讲解数学。还是那句话主要是给大家一个思路。这个思路其实并不局限在JSR-184上,相反这个思路是从DEMO中学过来的。
不过这里也要告诉大家该思路的缺点:
1. 只能判断静态物体和精灵的碰撞
2. 到目前为止我们还没有设计到高度这一维的检测,当然并不是这个思路不可以,仅仅是我觉得没有必要。
我稍候会给大家带来JSR-184中pick用法的讲解,也就是大家一般情况下所说的“碰撞”。
分享到:
相关推荐
在J2ME中开发3D游戏,通常会使用如MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration)等核心API。此外,开发者还可以借助第三方库,如J3D(Java 3D)或LWJGL( ...
《J2ME手机开发入门》是一本针对初学者的指南,旨在帮助读者快速掌握Java Micro Edition(J2ME)在移动设备上的应用开发技术。J2ME是Java平台的一个子集,专门设计用于资源有限的嵌入式设备,如早期的智能手机和平板...
J2ME开发教程涵盖了移动设备应用程序开发的各个方面,重点介绍了J2ME(Java 2 Platform, Micro Edition)的技术细节,这是一套专为嵌入式消费电子设备而设计的Java平台标准版的子集。J2ME广泛应用于早期的移动电话和...
本文将为你提供一个基于J2ME的手机游戏开发入门教程,旨在帮助初学者了解手机游戏的基本原理以及如何使用JBuilder进行开发。J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备...
**J2ME游戏开发入门** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、PDA等。它为开发小型应用程序,尤其是移动游戏,提供了丰富的工具和技术支持。本书籍"J2ME游戏...
在“JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_4_增加消除行声音”这个主题中,我们将学习如何在已有的游戏基础上加入消除行时的声音反馈,让游戏体验更加生动有趣。 首先,了解基本的J2ME编程是必要...
本篇文章将深入探讨J2ME手机游戏编程的基础知识,帮助初学者入门。 首先,我们需要了解J2ME的架构。J2ME由两部分组成:配置(Configurations)和Profile(Profiles)。配置定义了设备的基本硬件和软件能力,比如...
在《J2ME实用教程:从入门到精通的所有ppt》中,你可以期待学习以下关键知识点: 1. **J2ME架构**:了解CLDC(Connected Limited Device Configuration)和MIDP(Mobile Information Device Profile)是如何构成...
**Java 2 Micro Edition (J2ME) 手机游戏编程入门** J2ME是Java平台的一个子集,专门设计用于资源有限的设备,如早期的智能手机和移动设备。它是开发移动应用程序,尤其是游戏的常见选择,因为它具有跨平台兼容性、...
本教程针对初学者,将深入讲解J2ME的基础知识,帮助你快速入门。 一、J2ME概述 J2ME由Java ME配置(Configurations)和Java ME框架(Profiles)组成。配置定义了设备的最低硬件需求,如CLDC(Connected Limited ...
《J2ME手机游戏编程入门源码》是一个针对初学者的教育资源,主要涵盖了使用Java 2 Micro Edition(J2ME)平台开发手机游戏的基础知识。J2ME是Java的一个轻量级版本,广泛应用于移动设备,尤其是早期的智能手机,用于...
Java Micro Edition(J2ME)是...总之,通过这个入门教程,你可以了解到J2ME环境的设置,2D图形编程基础,以及如何利用这些知识来创建简单的移动游戏。不断练习和探索,你将能够熟练地开发出富有创意的J2ME 2D小游戏。
《J2ME手机游戏编程入门》是一本专为初学者设计的编程教程,它通过丰富的实例来引导读者掌握J2ME(Java 2 Micro Edition)平台上的游戏开发技术。J2ME是Java的一种轻量级版本,广泛应用于移动设备,如早期的智能手机...
《J2ME手机游戏编程入门》是一本专为初学者设计的编程教程,它深入浅出地介绍了如何使用Java Micro Edition(J2ME)技术来开发手机游戏。J2ME是Java平台的一个子集,主要用于嵌入式设备,尤其是移动设备如早期的智能...
这个“J2ME手机游戏编程入门源代码”资料对于想要学习J2ME游戏开发的人来说是一份宝贵的资源。通过深入研究这些源代码,你可以了解J2ME游戏开发的基本结构、设计模式以及关键技术和技巧。 首先,你需要了解J2ME的...
尽管3D游戏在J2ME上具有挑战性,但这个教程可能会提供一些实用的技术和工具,如J3D库,以简化3D游戏的实现。开发者可能学习到如何创建3D场景、物体以及如何处理复杂的3D运算。 J2ME的开发不仅需要理解Java语言的...
1. **J2ME基础**:首先,教程会介绍J2ME的基础架构,包括MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration),这两个是J2ME的核心组成部分。MIDP提供了用户界面和网络功能...