中国领先的IT技术网站
|
|

11.8.2 边界球重叠测试

《Android 4游戏入门经典(第3版)》第11章3D 编程技巧,本章我们揭开了游戏编程的神秘面纱。我们探讨了3D 向量,其使用方法与2D 中的向量类似,仅需要增加一个z 坐标即可!本章也讨论了OpenGL ES 中的光照系统。还探讨了如何借助Matrix 类用少量的代码实现简单的欧拉照相机和跟随照相机。本节为大家介绍边界球重叠测试。

作者:赵凯/佘建伟 译来源:清华大学出版社|2013-10-29 21:54

CTO训练营 | 12月3-5日,深圳,是时候成为优秀的技术管理者了


11.8.2 边界球重叠测试

三角形网格和轴对齐边界盒的碰撞检测运算十分复杂。对于下一个将介绍的游戏,使用边界球就可以了。另外还有一个曾运用于Super Jumper 游戏中的小技巧:为了让边界球更好地工作,让它比对象的图形表示更小。图11-13 展示了宇宙飞船的边界球。

这是个简单实用的小技巧,在很多情况下足以保证碰撞检测的正确执行。

那么如何使两个球体进行碰撞呢?或者说如何检测重叠呢?处理方法与圆的重叠检测方法完全相同!所需要做的是计算出两个球体的中心间的距离。如果这个距离小于两个球体半径之和,则两球体发生了碰撞。下面编写一个简单的Sphere 类,如程序清单11-14 所示。

程序清单11-14 Sphere.java,一个简单的边界球

  1. package com.badlogic.androidgames.framework.math;  
  2. public class Sphere {  
  3. public final Vector3 center = new Vector3();  
  4. public float radius;  
  5. public Sphere(float x, float y, float z, float radius) {  
  6. this.center.set(x,y,z);  
  7. this.radius = radius;  
  8. }  

以上代码与第8 章的Circle 类的代码类似,改动的仅仅是中心向量用Vector3 代替了Vector2。下面扩展OverlapTester 类,添加新方法检测球体重叠并检测一个点是否在球体内,如程序清单11-15 所示。

程序清单11-15 摘自OverlapTester.java,添加球体检测方法

  1. public static boolean overlapSpheres(Sphere s1, Sphere s2) {  
  2. float distance = s1.center.distSquared(s2.center);  
  3. float radiusSum = s1.radius + s2.radius;  
  4. return distance <= radiusSum * radiusSum;  
  5. }  
  6. public static boolean pointInSphere(Sphere c, Vector3 p) {  
  7. return c.center.distSquared(p) < c.radius * c.radius;  
  8. }  
  9. public static boolean pointInSphere(Sphere c, float x, float y, float z) {  
  10. return c.center.distSquared(x, y, z) < c.radius * c.radius;  

同样,这与Circle 类中的重叠检测代码完全类似,只是球体中心坐标用Vector3 代替了Circle中的Vector2。

注意:有很多书介绍了3D 碰撞检测的处理方式。如果想要更深入地学习,推荐阅读由ChristerEricson 撰写的Real-time Collision Detection 一书(Morgan Kaufmann, 2005)。该书可以说是游戏开发者的首选资料。

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月最赞

读 书 +更多

网络服务器配置与应用(第3版)

本书是由长期从事网络管理工作和网络工程人员培训工作的一线网管人员和教学人员精心编写,从现实的技术发展角度和实际应用的角度,通过大量...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× Phthon,最神奇好玩的编程语言