android 3D 游戏实现之综合实例(初步)

分享177个安卓游戏源码,总有一款适合你 阅读详情

效果比5月份那份代码和谐了一点,但仍有待改进,现在我将代码发上来。奋斗

 完整项目可以去http://simdanfeg.download.youkuaiyun.com/处下载

(1)Activity类

package sim.feel;

import java.io.IOException;
import java.io.InputStream;

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

public class AdvancedExample extends Activity {
 // GLSurfaceView
 private GLSurfaceView glView;
 // 实例化MyRenderer对象
 private MyRenderer mr = new MyRenderer();

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // 设置无标题
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  // 设置全屏
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
  // init loadFile
  new LoadFile(getResources());
  glView = new GLSurfaceView(this);
  glView.setRenderer(mr);
  setContentView(glView);
 }
}

// 载入文件
class LoadFile {
 public static Resources resource;

 public LoadFile(Resources res) {
  resource = res;
 }

 // file
 public static InputStream loadf(String fileName) {
  AssetManager am = LoadFile.resource.getAssets();
  try {
   return am.open(fileName);
  } catch (IOException e) {
   return null;
  }
 }

 // image
 public static Bitmap loadi(int id) {
  Bitmap bitmap = BitmapFactory.decodeResource(resource, id);
  return bitmap;
 }
}


 

(2)Renderer类

package sim.feel;

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

import android.graphics.Bitmap;
import android.opengl.GLSurfaceView.Renderer;

import com.threed.jpct.Camera;
import com.threed.jpct.Config;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.GenericVertexController;
import com.threed.jpct.Light;
import com.threed.jpct.Loader;
import com.threed.jpct.Matrix;
import com.threed.jpct.Mesh;
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.TextureInfo;
import com.threed.jpct.TextureManager;
import com.threed.jpct.World;
import com.threed.jpct.util.MemoryHelper;

/**
 * 一个包含3ds,md2导入及纹理等的综合例子
 * 
 * @author Simdanfeg
 * 
 */
public class MyRenderer implements Renderer {
 // 圆周率
 private static float PI = (float) Math.PI;
 // FrameBuffer
 private FrameBuffer fb = null;
 // World对象
 private World world = null;
 // Object3D对象,分别为平面,人物,岩石,天空
 private Object3D plane = null;
 private Object3D snork = null;
 private Object3D rock = null;
 private Object3D dome = null;
 // Light对象
 private Light sun = null;
 // ind
 private float ind = 0;
 // FPS
 private int fps = 0;
 // 返回当前毫秒数
 private long time = System.currentTimeMillis();
 // Bitmap对象
 private Bitmap igrass = null;
 private Bitmap idisco = null;
 private Bitmap irock = null;
 private Bitmap inormals = null;
 private Bitmap isky = null;
 // TextureManager对象
 private TextureManager tm = null;

 // 默认构造
 public MyRenderer() {
  // 优化操作
  Config.maxPolysVisible = 1000;
  Config.farPlane = 1500;
  Config.glTransparencyMul = 0.1f;
  Config.glTransparencyOffset = 0.1f;
  Config.useVBO = true;
  Texture.defaultToMipmapping(true);
  Texture.defaultTo4bpp(true);
 }

 // 将载入的图片添加到TextureManager中
 public void loadTexture() {
  igrass = LoadFile.loadi(R.drawable.grasssample2);
  idisco = LoadFile.loadi(R.drawable.disco);
  irock = LoadFile.loadi(R.drawable.rock);
  inormals = LoadFile.loadi(R.drawable.normals);
  isky = LoadFile.loadi(R.drawable.sky);
  // TextureManager
  tm = TextureManager.getInstance();
  tm.addTexture("grass", new Texture(igrass));
  tm.addTexture("disco", new Texture(idisco));
  tm.addTexture("rock", new Texture(irock));
  tm.addTexture("normals", new Texture(inormals));
  tm.addTexture("sky", new Texture(isky));
 }

 public void onDrawFrame(GL10 gl) {
  SimpleVector offset = new SimpleVector(1, 0, -1).normalize();
  // animate the snork and the dome
  animate();
  offset.rotateY(0.007f);
  // render the scene
  fb.clear();
  world.renderScene(fb);
  world.draw(fb);
  fb.display();

  // print out the fps to the console

  if (System.currentTimeMillis() - time >= 1000) {
   System.out.println(fps);
   fps = 0;
   time = System.currentTimeMillis();
  }
  fps++;
 }

 public void onSurfaceChanged(GL10 gl, int width, int height) {
  if (fb != null) {
   fb = null;
  }
  fb = new FrameBuffer(gl, width, height);
 }

 public void onSurfaceCreated(GL10 gl, EGLConfig height) {
  // 启用混合
  gl.glEnable(GL10.GL_BLEND);
  gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
  // Load textures
  loadTexture();
  // World
  world = new World();
  // 设置world环境光
  world.setAmbientLight(120, 120, 120);

  // Load/create and setup objects
  // 平面(草地)
  plane = Primitives.getPlane(20, 15);
  plane.rotateX(PI / 2);
  plane.setSpecularLighting(true);
  // 设置纹理
  plane.setTexture("grass");
  plane.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
  // plane.forceGeometryIndices(true);

  // 岩石
  rock = loadModel("rock.3ds", 15f);
  rock.translate(0, 0, -90);
  rock.rotateX(-PI / 2);
  // 设置双重纹理
  TextureInfo stoneTex = new TextureInfo(tm.getTextureID("rock"));
  stoneTex.add(tm.getTextureID("normals"), TextureInfo.MODE_MODULATE);
  rock.setTexture(stoneTex);
  rock.setSpecularLighting(true);

  // 人物
  snork = Loader.loadMD2(LoadFile.loadf("snork.md2"), 0.8f);
  snork.translate(0, -25, -50);
  snork.rotateY(45);
  snork.setTexture("disco");
  // 设置碰撞模式
  snork.setCollisionMode(Object3D.COLLISION_CHECK_SELF);

  // 天空
  dome = loadModel("dome.3ds", 0.5f);
  dome.build();
  dome.setTexture("sky");
  dome.calcTextureWrap();
  // 优化,但有用此方法显示有问题
  // tileTexture(dome, 3);

  // 计算plane与dome的差矢量
  dome.translate(plane.getTransformedCenter().calcSub(
    dome.getTransformedCenter()));
  dome.setLighting(Object3D.LIGHTING_NO_LIGHTS);
  // dome.forceGeometryIndices(true);
  dome.setAdditionalColor(RGBColor.WHITE);

  // 将Object3d传入到World对象中
  world.addObject(plane);
  world.addObject(rock);
  world.addObject(snork);
  world.addObject(dome);
  // 编译world中所有对象
  world.buildAllObjects();
  // Compile all objects for better performance
  plane.compile();
  rock.compile();
  dome.compile();
  plane.strip();
  rock.strip();
  dome.strip();

  // 变形plane,这太有意思了,我喜欢
  // Deform the plane
  Mesh planeMesh = plane.getMesh();
  planeMesh.setVertexController(new Mod(), false);
  planeMesh.applyVertexController();
  planeMesh.removeVertexController();
  // Move camera
  Camera cam = world.getCamera();
  cam.moveCamera(Camera.CAMERA_MOVEOUT, 150);
  cam.moveCamera(Camera.CAMERA_MOVEUP, 100);
  cam.lookAt(plane.getTransformedCenter());
  cam.setFOV(1.5f);
  // Setup dynamic light source
  sun = new Light(world);
  sun.setIntensity(250, 250, 250);
  // 回收内存
  MemoryHelper.compact();
 }

 /*
  * 动画
  */
 private void animate() {
  ind += 0.1f;
  if (ind > 1) {
   ind -= 1;
  }
  snork.animate(ind, 2);
  snork.rotateY(-0.02f);
  snork.translate(0, -50, 0);
  SimpleVector dir = snork.getXAxis();
  dir = snork.checkForCollisionEllipsoid(dir, new SimpleVector(5, 20, 5),
    5);
  snork.translate(dir);
  dir = snork.checkForCollisionEllipsoid(new SimpleVector(0, 100, 0),
    new SimpleVector(5, 20, 5), 1);
  snork.translate(dir);
 }

 // 载入模型
 private Object3D loadModel(String filename, float scale) {
  // 将载入的3ds文件保存到model数组中
  Object3D[] model = Loader.load3DS(LoadFile.loadf(filename), scale);
  // 取第一个3ds文件
  Object3D o3d = new Object3D(0);
  // 临时变量temp
  Object3D temp = null;
  // 遍历model数组
  for (int i = 0; i < model.length; i++) {
   // 给temp赋予model数组中的某一个
   temp = model[i];
   // 设置temp的中心为 origin (0,0,0)
   temp.setCenter(SimpleVector.ORIGIN);
   // 沿x轴旋转坐标系到正常的坐标系(jpct-ae的坐标中的y,x是反的)
   temp.rotateX((float) (-.5 * Math.PI));
   // 使用旋转矩阵指定此对象旋转网格的原始数据
   temp.rotateMesh();
   // new 一个矩阵来作为旋转矩阵
   temp.setRotationMatrix(new Matrix());
   // 合并o3d与temp
   o3d = Object3D.mergeObjects(o3d, temp);
   // 主要是为了从桌面版JPCT到android版的移徝(桌面版此处为o3d.build())
   o3d.compile();
  }
  // 返回o3d对象
  return o3d;
 }

 // static class Mod
 public static class Mod extends GenericVertexController {
  private static final long serialVersionUID = 1L;

  public void apply() {
   // 返回未修改前plane的Mesh信息
   SimpleVector[] s = getSourceMesh();
   // 定义SimpleVector得到DestinationMesh
   SimpleVector[] d = getDestinationMesh();
   // 变形主要操作
   for (int i = 0; i < s.length; i++) {
    d[i].z = s[i].z
      - (10f * ((float) Math.sin(s[i].x / 50f) + (float) Math
        .cos(s[i].y / 50f)));
    d[i].x = s[i].x;
    d[i].y = s[i].y;
   }
  }
 }
}

 

效果图

安卓游戏应用如何在linux上流畅运行 卓懿移动应用兼容运行环境(以下简称“卓懿”)突破了应用生态发展的传统思路,让成熟的商业应用和行业应用成为国产平台应用生态的一部分。卓懿集成了应用商城,能够解决用户的多样化需求,用户可以通过应用商城安装和运行安卓软件,以“最少的改动,最小的代价”,让各类应用在国产平台上完全以原生的桌面应用模式运行,实现商业应用、行业应用与国产平台应用的完美融合。 卓懿包含以下特征 一、将手机游戏完全实现桌面化,键鼠操作相对于手机操作更加灵活,反应速度更快,让用户体验极致快感; 海量应用 二、拥有海量热门游戏应用,包含:金铲 阅读详情

相关推荐

Android 3D游戏开发(基础篇)——Opengl ES游戏引擎实现(送源码)

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

hzpeixun的专栏 2533

body软件 human_人体系统女性3D软件破下载|人体系统女性3d专业中文版下载v1.0(Human body female)-乐游网安卓下载...

《人体系统女性3d专业中文版》是一款可以帮助各位去了解以及认识女性生理结构的软件,逼真的3D建模在各个方面的数据都很真实,专业中文版更加的详细,可以调节每一个环节,选择骨骼或者是各种器官进行观察,了解女性的身体结构,当然更加适合于医学方面的人使用,感兴趣的亲们赶紧下载吧。软件介绍人体系统女性3D 是一个通过动画介绍女性人体构造的软件,通过这款软件你们学习到最真实的人体系统分部和结构,认识各个器官的...

weixin_42393362的博客 5万+

Android平台3D游戏开发全解析与实例教程

OpenGL ES(Open Graphics Library for Embedded Systems)是由Khronos Group开发的一种用于嵌入式系统的图形API,它是基于OpenGL发展而来的一套适用于移动设备和嵌入式系统的图形标准。OpenGL ES结合了OpenGL的强大功能和适用于移动设备的轻量级优化,它具有以下特性:跨平台兼容性:OpenGL ES可用于各种嵌入式系统,从最小的移动设备到具有强大图形处理能力的平板电脑。硬件加速。

weixin_30356433的博客 1112

OpenGL超级宝典笔记——纹理映射Mipmap

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34228387的博客 594

Android 3D乡村赛车游戏开发教程

在本章中,我们将探讨Android平台上开发3D游戏的基础知识。随着智能手机性能的提升和普及,3D游戏已经成为一个重要的应用领域。开发3D游戏不仅需要程序员具备Java或Kotlin编程技能,还需要了解3D图形学和游戏引擎的使用。Android应用的资源管理是开发中的关键环节,有效的管理策略不仅可以提高开发效率,还可以提升应用的性能和用户的体验。通过上述章节的介绍,开发者可以了解到资源文件的目录结构、如何优化资源、实现国际化支持、使用工具进行资源检查以及应对实际项目中资源管理挑战的方法和策略。

weixin_36299472的博客 1095

全面掌握Android 3D游戏开发技术:源码解析

随着移动设备性能的不断提升,Android平台已经成为游戏开发者们的一个重要战场。开发者们利用这个平台,不仅能够创造出令人耳目一新的2D游戏,更是能够在3D游戏领域大展拳脚。本章将带您了解Android平台3D游戏开发的基础知识,包括市场趋势、开发工具和主要技术栈,为接下来深入学习OpenGL ES及Android SDK等关键技术做准备。

weixin_35751412的博客 729

android sex games app,Beginning Android Games 2nd Edition

摘要:Beginning Android Games, Second Edition offers everything you need to join the ranks of successful Android game developers, including Android tablet game app development considerations. You'll sta...

weixin_42504649的博客 1万+

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

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

weixin_42515340的博客 1256

android 3D 游戏实现之人物行走(MD2)

如果充分理解了HelloWorld(见android 3D 游戏实现之First step),了解了一些JPCT-AE游戏框架的机制, 那么,这个示例可以是进阶篇了,其实用JPCT-AE加载3DS,MD2文件都很简单了,主要是掌握一些基本的操作, 今天我先把怎么实现加载MD2文件的代码附上,明天我再传上如果实现载入3DS及3DS KeyFrame动画的代码附上。         此程序所需

Simdanfeg的专栏 9691

Android高级进阶十二 Android3D引擎(JPCT-AE)构建立方体源码

使用JPCT-AE,并且做一个使用JPCT-AE构建立方体的实例,代码都有注释算是入门篇

基于Android studio编写的坦克大战游戏.zip

使用Android studio开发的坦克大战游戏,适合刚刚开始学习的小白使用,功能简单,也可以用来当作一个期末的大作业使用,不是很复杂,后续还会有更新。

android 3D 游戏实现之First Step

此示例展示了一个立方体的具体实现过程,与之前的纯Opengl es实现相比,它采用了JPCT-AE来实现,因为个人认为这个框架很方便,于是从今天开始通过其网站上的Wiki来介绍JPCT-AE的实现。通过这个示例能让你快速了解JPCT-AE的帮助文档,也就是入门。   (1)什么是JPCT:一种封装了OPENGL es的3D游戏引擎,有j2se与android两个版本。 (2)如何获得其jar

Simdanfeg的专栏 1万+

3D游戏人物

该部分是3D人物的源码,希望可以帮助到有需要的人。也是从别人那里拿来的代码

安卓 3D 游戏开发入门指南(一)

Android 操作系统是一种广泛应用于手机和平板电脑的操作系统。它甚至被用在一个叫做 Ouya 的视频游戏控制台上。Android 手机从需要合同的昂贵手机到不需要任何合同的廉价预付费手机。为 Android 平台开发程序不需要任何开发者费用,不像苹果移动设备需要年费才能在他们的设备上运行你的程序。一部可以使用 OpenGL ES 2.0 开发 3D 游戏的性能良好的预付费非合约 Android 手机可以在Amazon.com上买到,价格低至 75-100 美元,免运费。本节讨论 Android SDK。

龙哥盟 4278

用blender为模型贴图并在gazebo中显示

用blender为模型贴图并在gazebo中显示 首先我用的是最新的blender2.92版本,附上链接https://www.blender.org/download/。并设置好简体中文。语言可以在编辑->偏好设置->界面里面设置。 首先界面右上角的摄像头,方块,灯光三个场景全都删除。 接着导入stl格式的模型文件,下面以tianbot_mini上面的激光雷达的模型为例。 导入激光雷达模型后,点击进入上方的UV Editing按钮进入UV编辑界面 此时我面看见网格化的激光雷达模型

qq_48427527的博客 8000

Ubuntu使用gstreamer开发USB相机应用(一)

Ubuntu使用gstreamer开发USB相机应用(一) 包括:gstreamer安装,测试。使用v4l2测试USB相机。使用gstreamer采集相机

Alon1787的博客 2739

Android 3D效果的实现

系列文章目录 Android 3D效果的实现 文章目录系列文章目录前言一、先看看聊天(需求)二、实现效果三.实现1.通过getSystemService获得SensorManager实例对象2.通过SensorManager实例对象获得想要的传感器对象:参数决定获取哪个传感器3.在获得焦点时注册传感器并让本类实现SensorEventListener接口4.必须重写的两个方法:onAccuracyChanged,onSensorChanged5.在失去焦点时注销传感器(为Activity提供调用)6.d

计蒙不吃鱼的博客 3973

LightRAG实战:从零构建中药知识图谱,解锁六种检索模式效能对比

本文详细介绍了如何使用轻量级RAG框架LightRAG从零构建中药知识图谱的实战过程。通过本地部署环境搭建、开源模型配置与《本草纲目》数据导入,文章重点对比了Naive、Local、Global、Hybrid、Mix和Bypass六种检索模式在中药问答中的效能差异,并提供了可视化图谱与优化心得,为开发者构建专业领域智能问答系统提供了实用指南。

weixin_29096377的博客 176

unity 3d原创制作射击游戏(全完整版+安卓apk编译)

unity 3d 原创制作射击游戏,主要运用了3dmax和unity。涉及到了动画、c#、canvas、Panel、Text、Button、Image、RawImage、刚体等等等等的内容,编译了安卓apk的版本。

mackilo的博客 1万+

PCL Super4PCS算法实现点云粗配准(版本一)【2025最新版】

Win11系统下实现[Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。

点云侠的博客 3378

基于STM32的农业蔬菜大棚温湿度采集控制系统(代码+仿真+全部资料)

摘要: 本研究设计了一种基于STM32微控制器的农业蔬菜大棚温湿度智能控制系统。系统通过DHT11传感器实时采集温湿度数据,LCD屏显示当前值及预设阈值,用户可通过按键模块调整阈值范围。当温湿度超出设定阈值时,系统自动控制风扇或加湿器进行调节,确保大棚环境稳定。实验验证表明,该系统具备高精度监测、稳定控制和模块化扩展等优势,有效优化蔬菜生长环境。未来可扩展远程监控等功能,进一步提升智能化水平。 关键词: STM32、温湿度控制、蔬菜大棚、DHT11、自动化调节

3254968421的博客 785

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

先还是大体说一下这个程序的原理吧(正方体与球体之间)。   (1)建立相关对象:正方体,3个球体以及为它们铺上纹理 (2)分别为每个对象设定碰撞模式,方法为setCollisionMode(int mode),3个球体为COLLISION_CHECK_OTHERS,cube为COLLISION_CHECK_SELF (3)将其添加到world对象中,及处理必要的Camera参数 (4)在

Simdanfeg的专栏 5727

【ComfyUI】Flux 完整版文生图

本文介绍了一个基于Flux Dev的AI文生图全流程工作流,通过整合扩散模型、文本编码器和VAE解码器等核心组件,实现从文本到高清图像的端到端生成。工作流包含模型加载、条件构建、潜空间采样、图像解码和成果保存五个关键环节,支持高分辨率图像的细节还原和艺术风格塑造。应用场景涵盖艺术创作、内容生产、教学演示和科研数据准备等领域,适用于对画质和提示遵循性要求严格的场景。文章还提供了相关开发资源和学习教程链接,帮助用户深入理解AI绘图机制和实际应用。

Mr数据杨 1276

Unity安卓游戏开发:打造7款2D & 3D游戏 Unity Android Game Development : Build 7 2D & 3D Games

流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确) |大小:15.4 GB |时长:32h 55m Unity游戏开发与设计,用C# & Unity学习Unity安卓游戏开发(更新Unity 2021) 你会学到什么 用Unity打造5款2D和3D游戏 在谷歌Play商店出版游戏 用视频广告赚钱 创作自己的游戏艺术作品 创建在线排行榜 创建成就解锁系统 描述 您将制作的游戏列表: 3D之字..

2375

Python 控制 Keysight N9010B/N9020/N9030 频谱仪

为什么要实现频谱仪的控制呢?起因是因为我司RF的同事们需要对通信模块进行GSM的带内杂散进行测试,由于该测试的频点涉及900多个,所以急需开发一款自动化测试工具。该工具需同时实现对无线通讯仪和频谱仪的控制,这篇文章主要介绍一下频谱仪的控制!做通信的应该对频谱仪都不陌生,不过我之前做的都是软件相关行业,所以我对频谱仪其实还是很陌生的;不过好在我的同时们都很热心,加上仪器的文档,一段时间下来,也算是熟悉了一些。

xgh1951的博客 1万+

Eplan设计师必会—伺服安全回路的设计方法

本文介绍了在EPLAN中设计伺服STO安全回路的方法。首先需查阅伺服驱动器说明书确定STO接线端子,重点关注双通道配置。设计步骤包括:使用黑盒子功能绘制驱动器外形,正确标注STO接线点,并连接安全继电器或PLC的安全输出。关键注意事项有:必须采用双通道独立布线,确保同步动作,遵循故障安全原则,使用常闭触点串联回路。文中以西门子V90和汇川伺服为例说明具体接线要求,并附有项目实例参考。

Qinmingyue13的博客 436
上一篇: android 3D 游戏实现之简单碰撞检测
下一篇: JAVA 3D 碰撞检测Demo
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值