android 3D 游戏实现之简单碰撞检测

Android 3D游戏开发(基础篇)——Opengl ES游戏引擎实现(送源码) Android 3D游戏开发(基础篇)——Opengl ES游戏引擎实现(送源码)课程描述:     本教程可以带领大家从一个普通的Android应用开发者进入3D应用的世界,从3D应用开发基础知识开始,完成受众多手机用户所喜爱的3D应用的开发。定价:224元(1年有效) 阅读详情

先还是大体说一下这个程序的原理吧(正方体与球体之间)。

 

(1)建立相关对象:正方体,3个球体以及为它们铺上纹理

(2)分别为每个对象设定碰撞模式,方法为setCollisionMode(int mode),3个球体为COLLISION_CHECK_OTHERS,cube为COLLISION_CHECK_SELF

(3)将其添加到world对象中,及处理必要的Camera参数

(4)在onDrawFrame函数中进行碰撞处理工作,因为是球体与正方体之间的碰撞,所以采用了相近的椭圆碰撞检测checkForCollisionEllipsoid(如果要用球体检测checkForCollisionSpherical,也能很好工作,这在代码处有相应注释)

 

下面附上源代码

 

(1)Activity类

package sim.feel;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

/**
 * Activity类
 * 
 * @author Administrator
 * 
 */
public class Basic_collision extends Activity {
 private GLSurfaceView glView;
 private MyRenderer mr = new MyRenderer();

 // onCreate
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // 传入Resources方法
  LoadBitmap.loadb(getResources());
  glView = new GLSurfaceView(this);
  glView.setRenderer(mr);
  setContentView(glView);
 }
}

// 载入位图文件
class LoadBitmap {
 public static Bitmap bitmap;

 // 载入位图方法
 public static void loadb(Resources res) {
  bitmap = BitmapFactory.decodeResource(res, R.drawable.icon);
 }
}

 

(2)MyRenderer类


package sim.feel;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

import com.threed.jpct.Camera;
import com.threed.jpct.Config;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.Logger;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.RGBColor;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.Texture;
import com.threed.jpct.TextureManager;
import com.threed.jpct.World;
import com.threed.jpct.util.MemoryHelper;

/**
 * MyRenderer类
 * 
 * @author Administrator
 * 
 */
public class MyRenderer implements Renderer {
 // FrameBuffer对象
 private FrameBuffer fb;
 // World对象
 private World world;
 // RGBColor
 private RGBColor back = new RGBColor(50, 50, 100);
 // Object3D对象
 private Object3D sphere1 = null;
 private Object3D sphere2 = null;
 private Object3D sphere3 = null;
 private Object3D cube = null;

 // SimpleVector
 // 通过设置组件的x,y,z向量来创建一个SimpleVector对象
 private SimpleVector move = new SimpleVector(0, 0.3, 1);
 // 被碰撞Object3D的x,y,z(此处该对象为球体)
 private SimpleVector ellips = new SimpleVector(7, 7, 7);
 private SimpleVector tmp = new SimpleVector();

 // FPS
 private int fps = 0;
 private long time = System.currentTimeMillis();
 private boolean stop = false;

 // 默认构造
 // 对该项目的一些优化
 public MyRenderer() {
  // 绘制的最多的Polygon数量,默认为4096,此处如果超过500,则不绘制
  Config.maxPolysVisible = 500;
  // 最远的合适的平面,默认为1000
  Config.farPlane = 1500;
  // Modifies the multiplicator for the transparency calculations in
  // jPCT-AE. The actual formula is trans=offset+objTrans*mul, default for
  // offset is 0.1f.
  Config.glTransparencyMul = 0.1f;
  // Modifies the offset for the transparency calculations in jPCT-AE. The
  // actual formula is trans=offset+objTrans*mul, default for offset is
  // 0.1f.
  Config.glTransparencyOffset = 0.1f;
  // 使JPCT-AE这个引擎使用顶点而不是顶点数组缓冲对象,因为它可能会使某些硬件更快
  // 但在Samsung Galaxy,它并不能工作的很好,可能使之崩溃,这就是它默认为false的原因
  Config.useVBO = true;

  Texture.defaultToMipmapping(true);
  Texture.defaultTo4bpp(true);
 }

 public void onDrawFrame(GL10 gl) {
  try {
   if (!stop) {
    // Do collision detections(碰撞检测)

    // 第1个参数为cube的移动(translation)
    // 第2个参数为碰撞的区域大小(ellips)
    // 此处的第3个参数为:递归深度的碰撞检测,较高的值将提高碰撞检测精度,而且降低性能。合理的值介于1和5。
    // trsn包含当前的坐标信息
    SimpleVector trsn = cube.checkForCollisionEllipsoid(move,
      ellips, 5);
    // 用下面的球体间碰撞也能很好的工作
    // SimpleVector trsn = cube.checkForCollisionSpherical(move, 2);
    // "移动这个对象通过改变其在JPCT-AE坐标系下的矩阵"
    cube.translate(trsn);
    // 如果cube当前z轴坐标大于
    // 100,重置当前cube的旋转值到默认值,换言之,没有了旋转
    if (cube.getTranslation(tmp).z > 50) {
     // 清除旋转
     cube.clearTranslation();
     // 重置为初始值
     cube.translate(10, -40, -30);
    }

    // 以定义好的RGBColor清屏
    fb.clear(back);
    // 变换和灯光所有的多边形
    world.renderScene(fb);
    // 绘制由renderScene产生的场景
    world.draw(fb);
    // 渲染显示图像
    fb.display();
    // fps加1
    fps++;
    // 打印输出fps
    if (System.currentTimeMillis() - time > 1000) {
     System.out.println(fps + "fps");
     fps = 0;
     time = System.currentTimeMillis();
    }
   } else {
    if (fb != null) {
     fb.dispose();
     fb = null;
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
   // 打印异常信息
   Logger.log("Drawing thread terminated!", Logger.MESSAGE);
  }
 }

 public void onSurfaceChanged(GL10 gl, int width, int height) {
  if (fb != null) {
   fb = null;
  }
  // 新产生一个FrameBuffer对象
  fb = new FrameBuffer(gl, width, height);
 }

 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  Logger.log("onCreate");
  // 混合渲染
  gl.glEnable(GL10.GL_BLEND);
  gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
  // 新建world对象
  world = new World();
  // 纹理相关
  TextureManager tm = TextureManager.getInstance();
  Texture texture2 = new Texture(LoadBitmap.bitmap);
  tm.addTexture("texture2", texture2);
  // 初始化各3D元素

  // 返回一个给定数量的面,第一个20表示面的数量,第二是球体的缩放
  sphere1 = Primitives.getSphere(20, 20);
  // 以纹理对象的方式给对象包装上纹理
  sphere1.calcTextureWrapSpherical();
  // 为sphere1设置纹理图片
  sphere1.setTexture("texture2");

  // 复制当前的Object3D对象
  sphere2 = sphere1.cloneObject();
  sphere3 = sphere1.cloneObject();
  // 返回一个立方体,其中2为其缩放变量
  cube = Primitives.getCube(2);
  // 以Z轴20处来旋转球体(其实就是向里移动球体)
  sphere2.translate(0, 0, 20);
  // 以Z轴40处来旋转球体
  sphere3.translate(0, 0, 40);

  // 以(10, -40, -30)来旋转立方体
  cube.translate(10, -40, -30);

  cube.setAdditionalColor(RGBColor.GREEN);

  // 将3D元素添加到world对象中
  world.addObject(sphere1);
  world.addObject(sphere2);
  world.addObject(sphere3);
  world.addObject(cube);

  // 建立碰撞模式
  sphere1.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
  world.addObject(sphere1);
  sphere2.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
  world.addObject(sphere1);
  sphere3.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
  world.addObject(sphere1);
  // 建立碰撞模式
  cube.setCollisionMode(Object3D.COLLISION_CHECK_SELF);

  // 设置环境光
  world.setAmbientLight(255, 255, 255);
  // 编译所有对象
  world.buildAllObjects();

  // Camera相关
  Camera cam = world.getCamera();
  // 向里以50的速度移动
  cam.moveCamera(Camera.CAMERA_MOVEOUT, 50);
  // 向外以60的速度移动
  cam.moveCamera(Camera.CAMERA_MOVEUP, 60);
  // 以sphere2对象作为中心视角
  cam.lookAt(sphere2.getTransformedCenter());

  // 回收内存
  MemoryHelper.compact();
 }
}

 运行效果如下图所示:

60、3D 游戏编程技巧与 Android 入侵者游戏开发 本文介绍了3D游戏编程中的一些关键技术,包括3D物理模拟、对象表示和碰撞检测方法,并基于这些技术详细讲解了Android平台上的3D游戏《Android入侵者》的开发过程。内容涵盖游戏机制设计、游戏世界定义、资产创建、屏幕逻辑实现等方面,展示了如何从基础概念过渡到完整的游戏开发实践。 阅读详情

相关推荐

Android 2D游戏开发实战:遮挡与碰撞检测实现详解

在移动游戏开发领域,Android平台凭借其开放性和广泛的设备覆盖率,成为2D游戏开发的热土。相较于3D游戏,2D游戏在资源消耗、开发复杂度和美术制作上更具优势,适合独立开发者与中小团队快速实现创意落地。Android 2D游戏通常由游戏引擎、资源管理、场景构建、精灵(Sprite)绘制、动画控制、输入事件处理、碰撞与遮挡检测等多个模块组成。其中,游戏引擎的选择尤为关键,常见引擎如LibGDX、AndEngine、Unity(2D模式)等,均提供了丰富的API支持和跨平台能力。

weixin_42599558的博客 1512

Android 实现图片的自动缩放,适应分辨率不同的手机

Android 实现图片的自动缩放,适应分辨率不同的手机 分类: Android UI Android开发 2012-05-19 14:01 19人阅读 评论(0) 收藏 举报 以下代码可实现Android图片按照不同屏幕手机的大小 比例缩放。 1、定义 bitmap public Bitmap viewBg;// 背景图 2、给他图片资源 viewBg = B

fay8048的博客 7131

Android 3D游戏开发全面案例解析

Android 3D游戏开发经历了从简单2D渲染到复杂3D图形处理的演进。随着移动设备性能的提升,开发者开始在Android平台上运用OpenGL ES等图形API,创建出视觉效果更加丰富和逼真的游戏体验。为了简化3D模型的导入流程,通常会使用专门的工具或插件来辅助完成工作。下面介绍几款常用的模型导入工具:Blender。

weixin_42515340的博客 1256

Android之小球自由碰撞动画

Android 动画之小球碰撞 1. add balls List ballList.add(new Ball(80, Color.GREEN, 700, width / 2, height / 2)); ballList.add(new Ball(100, Color.YELLOW, 600, width / 4 * 3, height / 4 * 3)); ballList.add(new Ball(120, Color.RED, 800, width /

jyb_007的博客 2824

《摩天大楼》Android 3D游戏开发源码分析与实践

在《摩天大楼》这款游戏中,玩家扮演建筑师的角色,通过合理的规划和设计,逐步建设一座属于自己的摩天大楼。游戏提供了丰富的建筑模块和装饰品,通过模拟真实建筑过程,玩家可以体验到从规划到建设的全过程。Android平台的3D图形技术始于2008年,随着第一款搭载Android系统的智能手机的发布,3D图形技术便成为了移动设备领域中的一大亮点。在最初的几年里,受限于当时的硬件性能,Android上的3D图形应用主要局限于简单的动画和2D游戏场景的渲染。

weixin_30798867的博客 675

掌握圆形碰撞技术:Android游戏开发项目实战

本文还有配套的精品资源,点击获取 简介:在Android游戏开发中,圆形碰撞检测是2D游戏交互的关键。本项目“CircleCollision”通过实例展示如何在Android平台上实现圆形对象的碰撞检测。文章首先介绍了Android游戏开发的基础,包括编程语言、开发工具和游戏引擎。然后详细探讨了图形碰撞检测,特别是圆形碰撞检测的算法和实现步骤。最后分析了项目结构,包括主活动...

weixin_29607511的博客 1746

unity中实现碰撞效果(无废话),不用代码,简单好抄

6.将鼠标移动到x这个字母上,鼠标上下移动就能改变x的值,当两个物体触碰到一起得时候我们就能观察到碰撞效果了。3.给物体添加刚体属性将静态的改为Dynamic,这里可以两个都添加,也可以只添加其中一个物体的。4.将重力大小设置为0,不然运行的时候物体会直接掉下去。如果在控制台找不到刚体组件,可以在这个地方手动添加。1.首先建立2个物理静态精灵并设置他们的颜色。5.运行游戏并随便选择旁边刚刚创建的一个物体。2.给两个物体添加碰撞器组件。

2301_76156790的博客 2992

Android 3D jpct-ae 两个小球的碰撞检测

jpct-ae做的两个小球的碰撞检测,熟悉一下这个游戏引擎,代码的注释很详细。

OpenGL.ES在Android上的简单实践:10-曲棍球(拖动物体、碰撞测试)

OpenGL.ES在Android上的简单实践:10-曲棍球(拖动物体、碰撞测试) 1、让木槌跟随手指移动 继续上一篇文章9的内容。既然可以测试木槌是否被触碰了,我们将继续努力下去:当我们来回拖动木槌的时候,它要去哪里?我们可以用这种方式思考:木槌平放在桌面上,当我们来回移动手指的时候,木槌应该随着手指移动并继续平放在桌子上。我们可以通过执行 射线-平面(Ray-Plane) 相交测试计...

vx number:zzr_admin,拉入技术交流群。 957

android_3D_demo:左右屏显示两个3D立方体

Hello-Cube-Android 使用适用于 Android 的 OpenGL 示例应用程序旋转 3D 立方体。 道尔 3D

Android Studio基于索引法绘制立方体,利用OpenGL ES的glDrawElements方法实现

Android Studio基于索引法绘制立方体,利用OpenGL ES的glDrawElements方法实现

Programming 3D games on Android with Irrlicht and Bullet

Programming 3D games on Android with Irrlicht and Bullet (Part 1) Posted on May 19, 2011, 11:00 pm, by xp, under Programming. Just got a new Android phone (a Samsung Vibrant) a month ago, so after f...

weixin_33752045的博客 87

Android游戏开发之碰撞检测(矩形碰撞、圆形碰撞、像素碰撞)

本文为大家分享了Android游戏开发之碰撞检测,供大家参考,具体内容如下 矩形碰撞 原理: 两个矩形位置 的四种情况 不是这四中情况 则碰撞 圆形碰撞 原理: 利用两个圆心之间的距离进行判定.当两个圆心的距离小于半径之和则碰撞. 像素碰撞 原理:不适用 遍历所有像素 检测 太多了 多矩形碰撞 原理:设置多个矩形碰撞检测区域 检测碰撞矩形数组 与另一碰撞矩形数组之间的位置关系. 矩形碰撞 代码: public class MySurfaceView extends SurfaceView implements Callback, Runnable { private SurfaceHol

android检测碰撞的方法,Android手持设备游戏中的碰撞检测算法研究

摘 要: 针对Android手持终端中复杂游戏场景的碰撞检测需求,提出了一种基于包围球和AABB的实时碰撞检测算法。该算法针对不同的虚拟对象构建不同的包围盒,并将改进后的包围盒投影排序分组方法应用其中。将该算法与使用包围盒投影排序分组方法的包围球算法与AABB算法比较,实验表明,该算法在保持更高精度的前提下仍能满足复杂场景中实时碰撞检测的要求。关键词: Android ;碰撞检测;包围球;AABB...

weixin_32798919的博客 618

Android开发 OpenGL ES绘制3D 图形实例详解

主要介绍了Android开发 OpenGL ES绘制3D 图形实例详解的相关资料,需要的朋友可以参考下

SAM3模型国内快速上手:Modelscope权重下载+环境配置一条龙指南

本文详细介绍了SAM3模型在国内的快速部署方案,包括通过Modelscope平台下载权重文件、优化CUDA 11.8环境配置以及实战避坑技巧。针对国内开发者常见的网络问题和环境兼容性问题,提供了从权重下载到模型加载的全流程指南,帮助用户高效完成部署并快速上手SAM3模型。

weixin_28465009的博客 1137

Android 3D jpct-ae游戏引擎碰撞检测(类似台球碰撞)

作为一款开源的3D游戏引擎,jpct-ae还是不错的,文档很齐全,只是相关的教程很少很少,接触这个引擎有一个多星期了,学的挺郁闷,有些3ds模型加载不进去,又找不到相关的资料,模型贴图也是一塌糊涂,导致下面的台球桌看起来一点都不像。 这款游戏引擎在国内很小众,使用的人很少,资料也很少,找了很长时间,只有http://blog.youkuaiyun.com/Simdanfeg/article/category

itde1的专栏 3972

EEG/ERP新手必看:5本神经科学入门书籍推荐(附高清PDF下载)

本文为EEG/ERP研究新手推荐5本神经科学入门书籍,涵盖认知神经科学、数据分析、ERP技术等核心内容。特别推荐《认知神经科学—关于心智的生物学》和《事件相关电位基础》,这些书籍不仅提供理论框架,还包含实用案例和MATLAB代码,帮助研究者快速掌握脑电研究技术。附高清PDF下载,适合实验室小组学习。

weixin_29210727的博客 444

安卓游戏开发手册(二)

随着更高质量和性能的 3D 游戏范围不断扩大。然而,这需要硬件支持运行 Android 平台。旧设备尚未过时。当同一应用在不同设备上运行时,这就成为一个严重的问题。这对开发人员来说是一个挑战,要在不同设备上运行同一应用。在渲染、处理和资产方面,2D 和 3D 游戏之间存在许多技术差异。开发人员应始终使用优化的方法来创建资产和编写代码。另一种提高性能的方法是为 2D 和 3D 游戏的不同硬件系统移植游戏。自上个十年以来,硬件平台已经有了革命性的升级。相应地,游戏的性质也发生了变化。

龙哥盟 964

QGIS-空间分析-核密度分析

本文在QGIS软件中使用核密度估计法分析全球历年的地震数据,旨在分析出地震频发且严重的区域,为地震防控提供参考依据。全球历年地震数据来源于网络,仅用于技术学习探索。通过核密度分析,可以观察到南美、美国西部海岸线和太平洋北部区域在全球地震分布状态中是最为集中和强烈的。

imxiezy的博客 2467

模拟CMOS集成电路设计入门学习(1)

模拟CMOS集成电路设计入门学习(1):二级效应

qq_61052827的博客 3084
上一篇: android 3D 游戏实现之静止岩石(3DS)
下一篇: android 3D 游戏实现之综合实例(初步)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值