效果图

模型加载类

package test.com.opengles9_1;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;import android.content.res.Resources;
import android.util.Log;
/*** Created by hbin on 2016/9/9.*/
public class LoadUtil {//从obj文件中加载仅携带顶点信息的物体public static LoadedObjectVertexOnly loadFromFile(String fname, Resources r,MySurfaceView mv){LoadedObjectVertexOnly lo=null;ArrayList<Float> alv=new ArrayList<Float>();//原始顶点坐标列表ArrayList<Float> alvResult=new ArrayList<Float>();//结果顶点坐标列表try{InputStream in=r.getAssets().open(fname);InputStreamReader isr=new InputStreamReader(in);BufferedReader br=new BufferedReader(isr);String temps=null;while((temps=br.readLine())!=null){String[] tempsa=temps.split("[ ]+");if(tempsa[0].trim().equals("v")){//此行为顶点坐标alv.add(Float.parseFloat(tempsa[1]));alv.add(Float.parseFloat(tempsa[2]));alv.add(Float.parseFloat(tempsa[3]));}else if(tempsa[0].trim().equals("f")){//此行为三角形面int index=Integer.parseInt(tempsa[1].split("/")[0])-1;alvResult.add(alv.get(3*index));alvResult.add(alv.get(3*index+1));alvResult.add(alv.get(3*index+2));index=Integer.parseInt(tempsa[2].split("/")[0])-1;alvResult.add(alv.get(3*index));alvResult.add(alv.get(3*index+1));alvResult.add(alv.get(3*index+2));index=Integer.parseInt(tempsa[3].split("/")[0])-1;alvResult.add(alv.get(3*index));alvResult.add(alv.get(3*index+1));alvResult.add(alv.get(3*index+2));}}//生成顶点数组int size=alvResult.size();float[] vXYZ=new float[size];for(int i=0;i<size;i++){vXYZ[i]=alvResult.get(i);}//创建物体对象lo=new LoadedObjectVertexOnly(mv,vXYZ);}catch(Exception e){Log.d("load error", "load error");e.printStackTrace();}return lo;}
}
package test.com.opengles9_1;import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.opengl.GLES20;
/*** Created by hbin on 2016/9/9.* //加载后的物体——仅携带顶点信息*/
public class LoadedObjectVertexOnly {int mProgram;//自定义渲染管线着色器程序idint muMVPMatrixHandle;//总变换矩阵引用int maPositionHandle; //顶点位置属性引用String mVertexShader;//顶点着色器代码脚本String mFragmentShader;//片元着色器代码脚本FloatBuffer   mVertexBuffer;//顶点坐标数据缓冲int vCount=0;public LoadedObjectVertexOnly(MySurfaceView mv,float[] vertices){//初始化顶点坐标与着色数据initVertexData(vertices);//初始化shaderinitShader(mv);}//初始化顶点坐标的方法public void initVertexData(float[] vertices){//顶点坐标数据的初始化================begin============================vCount=vertices.length/3;//创建顶点坐标数据缓冲//vertices.length*4是因为一个整数四个字节ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);vbb.order(ByteOrder.nativeOrder());//设置字节顺序mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据mVertexBuffer.position(0);//设置缓冲区起始位置//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题//顶点坐标数据的初始化================end============================}//初始化shaderpublic void initShader(MySurfaceView mv){//加载顶点着色器的脚本内容mVertexShader=ShaderUtil.loadFromAssetsFile("vertex_color.sh", mv.getResources());//加载片元着色器的脚本内容mFragmentShader=ShaderUtil.loadFromAssetsFile("frag_color.sh", mv.getResources());//基于顶点着色器与片元着色器创建程序mProgram = ShaderUtil.createProgram(mVertexShader, mFragmentShader);//获取程序中顶点位置属性引用maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");//获取程序中总变换矩阵引用muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");}public void drawSelf(){//制定使用某套着色器程序GLES20.glUseProgram(mProgram);//将最终变换矩阵传入着色器程序GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);// 将顶点位置数据传入渲染管线GLES20.glVertexAttribPointer(maPositionHandle,3,GLES20.GL_FLOAT,false,3*4,mVertexBuffer);//启用顶点位置数据GLES20.glEnableVertexAttribArray(maPositionHandle);//绘制加载的物体GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount);}
}

绘制类

package test.com.opengles9_1;import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;/*** Created by hbin on 2016/9/9.*/
public class MySurfaceView extends GLSurfaceView {private final float TOUCH_SCALE_FACTOR=180.0f/320;//角度缩放比例private SceneRenderer mRenderer;//场景渲染器private float mPreviousY;//上次的触控位置Y坐标private float mPreviousX;//上次的触控位置X坐标public MySurfaceView(Context context) {super(context);this.setEGLContextClientVersion(2);mRenderer=new SceneRenderer();setRenderer(mRenderer);//设置渲染模式为主动渲染setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);}//触摸事件回调方法@Overridepublic boolean onTouchEvent(MotionEvent e){float y=e.getY();float x=e.getX();switch (e.getAction()){case MotionEvent.ACTION_MOVE:float dy=y-mPreviousY;//计算y方向位移float dx=x-mPreviousX;//计算x方向位移mRenderer.yAngle+=dx*TOUCH_SCALE_FACTOR;mRenderer.xAngle+=dy*TOUCH_SCALE_FACTOR;requestRender();//重绘画面}mPreviousY=y;//记录触控笔位置mPreviousX=x;//记录触控笔位置return  true;}private class SceneRenderer implements  GLSurfaceView.Renderer{float yAngle;//绕y轴旋转角度float xAngle;//绕x轴旋转的角度//从指定的obj文件中加载对象LoadedObjectVertexOnly lovo;@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {//设置屏幕背景色RGBAGLES20.glClearColor(0.0f,0.0f,0.0f,1.0f);//打开深度检测GLES20.glEnable(GLES20.GL_DEPTH_TEST);//打开背面剪裁GLES20.glEnable(GLES20.GL_CULL_FACE);//初始化变换矩阵MatrixState.setInitStack();//加载要绘制的物体lovo=LoadUtil.loadFromFile("ch.obj",MySurfaceView.this.getResources(),MySurfaceView.this);}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {//设置视窗大小及位置GLES20.glViewport(0,0,width,height);//计算GLSurface宽高比float ratio=(float)width/height;//计算透视投影矩阵MatrixState.setProjectFrustum(-ratio,ratio,-1,1,2,100);//计算摄像机9参数位置矩阵MatrixState.setCamera(0,0,0,0f,0f,-1f,0f,1.0f,0.0f);}@Overridepublic void onDrawFrame(GL10 gl) {//清除深度缓冲与颜色缓冲GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT|GLES20.GL_COLOR_BUFFER_BIT);//坐标系推远MatrixState.pushMatrix();MatrixState.translate(0,-2f,-25f);//绕y轴,x轴旋转MatrixState.rotate(yAngle,0,1,0);MatrixState.rotate(xAngle,1,0,0);//若加载的物体不为空则绘制物体if(lovo!=null){lovo.drawSelf();}MatrixState.popMatrix();}}
}

项目下载地址

http://download.csdn.net/detail/hb707934728/9626495

opengles之3D模型加载(obj模型文件)相关推荐

  1. three.js加载obj模型和材质

    1.Vue中安装three.js和加载用的包 安装three.js使用npm install three --save 安装加载obj和mtl文件的包npm install three-obj-mtl ...

  2. three.js加载OBJ模型

    three.js加载OBJ模型 推荐一个免费下载3D模型的网址https://www.cgtrader.com,包含多种格式(obj, mtl等). three.js现在是es6语法,旧版本是es5的 ...

  3. threejs加载obj模型_Vulkan编程指南(章节31-载入模型)

    章节31 载入模型 介绍 本章节我们将会渲染一个带有纹理的三维模型. 库 我们使用tinyobjloader库来从OBJ文件加载顶点数据.tinyobjloader库是一个简单易用的单文件OBJ加载器 ...

  4. Python时间序列模型推理预测实战:时序推理数据预处理(特征生成、lstm输入结构组织)、模型加载、模型预测结果保存、条件判断模型循环运行

    Python时间序列模型推理预测实战:时序推理数据预处理(特征生成.lstm输入结构组织).模型加载.模型预测结果保存.条件判断模型循环运行 目录

  5. OpenGL学习脚印:模型加载初步-加载obj模型(load obj model)

    写在前面 前面介绍了光照基础内容,以及材质和lighting maps,和光源类型,我们对使用光照增强场景真实感有了一定了解.但是到目前为止,我们通过在程序中指定的立方体数据,绘制立方体,看起来还是很 ...

  6. WPF加载obj模型-2

    安装微软Expression Blend: 新建一个WPF项目: 把obj文件添加到项目: 然后把obj文件拖到MainWindow:模型出来了: 运行一下如下: 右击添加模型以后的xaml文件,外部 ...

  7. OpenGL模型加载之模型

    参考: https://learnopenglcn.github.io/03%20Model%20Loading/03%20Model/ 定义一个模型类 class Model {public:/* ...

  8. 使用three.js加载obj+mtl文件

    因在项目中运用到WEBGL的技术.所以研究了一下下.three.js库看来十分强大,此处为加载带材质的obj文件 1.下载相关js    https://threejs.org/     thee.j ...

  9. babyion 加载obj模型_在vue中使用babylonjs引入3d模型,打印mesh数据正常且无报错,但未在场景中显示,请问是什么环节出现了问题?...

    已解决,由于项目是由vue-cli3搭建的,将obj模型放入public后需要用es6语法引入. 首先在return中定义publicPath: process.env.BASE_URL 然后在引用路 ...

  10. 首次使用three.js加载obj模型未成功

    接此,https://blog.csdn.net/bcbobo21cn/article/details/110676331 基本代码如下: <!DOCTYPE html> <html ...

最新文章

  1. golang源码分析-启动过程概述
  2. 自然语言处理(NLP)之使用LSTM进行文本情感分析
  3. python私有函数
  4. 关于指针的一点小的理解
  5. HashMap 源码详细分析(JDK1.8)
  6. gis怎么改鼠标滚轮缩放_PhotoShop缩放画面的快捷方式
  7. 基于区域的OSPF简单口令认证(cisco packet tracer5.3)
  8. 文件包含--简单的代码审计绕过
  9. go 接口 构造器_Go 中接口值的复制
  10. 即时通讯软件在企业里的应用及发展
  11. Repeater控件绑定数据、分页、数据操作,最佳代码
  12. mysql - 一键安装方式- 课堂版
  13. aws lambda_Express.js和AWS Lambda —无服务器的爱情故事
  14. matlab thetal,基於matlab的車道和車道線檢測樣例
  15. 用c++创建xml文件的两种方法
  16. oracle 数据库 查看 目录,如何查看oracle数据库服务器名
  17. PS驴头案例,熟悉形状工具
  18. VSCODE + 搜狗输入法,文字突然变成了繁体字,为什么?
  19. iphone的照片如何同步到mac
  20. 软件项目管理与素质拓展-2.2什么是项目

热门文章

  1. 在IE浏览器访问网址时显示证书错误,导航已阻止
  2. 林海峰讲的python_线性回归模型与最小二乘法(附python源码)
  3. 2021-10-26 2021年B站1024安全攻防题第五题(安卓逆向)
  4. pwnable.kr第二遍---mistake
  5. 开题报告、论文摘要、摘要翻译、论文结论怎么写?
  6. 关于网站建设的主要流程和步骤(小白指南)
  7. 也许是史上最全的前端资源大汇总
  8. Insecure Direct Object References
  9. linux下卫士软件,Linux系统卫士
  10. Qt实现桌面右下角弹窗