本文讲述用OpenGL显示STL模型文件。

 

 

STL模型文件:Android OpenGL STL详解

 

Android OpenGL初级开发:Android OpenGL之使用GLSurfaceView创建一个3D旋转的图形

 

 

1.Model.java

public class Model {
    //三角面个数
    private int facetCount;
    //顶点坐标数组
    private float[] verts;
    //每个顶点对应的法向量数组
    private float[] vnorms;
    //每个三角面的属性信息
    private short[] remarks;


    //顶点数组转换而来的Buffer
    private FloatBuffer vertBuffer;


    //每个顶点对应的法向量转换而来的Buffer
    private FloatBuffer vnormBuffer;
    //以下分别保存所有点在x,y,z方向上的最大值、最小值
    float maxX;
    float minX;
    float maxY;
    float minY;
    float maxZ;
    float minZ;


    //返回模型的中心点
    public Point getCentrePoint() {
        float cx = (maxX - minX) / 2;
        float cy = (maxY - minY) / 2;
        float cz = (maxZ - minZ) / 2;
        return new Point(cx, cy, cz);
    }


    //包裹模型的最大半径
    public float getR() {
        float dx = (maxX - minX);
        float dy = (maxY - minY);
        float dz = (maxZ - minZ);
        float max = dx;
        if (dy > max)
            max = dy;
        if (dz > max)
            max = dz;
        return max;
    }


    public int getFacetCount() {
        return facetCount;
    }


    public void setFacetCount(int facetCount) {
        this.facetCount = facetCount;
    }


    public float[] getVerts() {
        return verts;
    }


    public void setVerts(float[] verts) {
        this.verts = verts;
        vertBuffer = Util.floatToBuffer(verts);
    }


    public FloatBuffer getVertBuffer() {


        return vertBuffer;
    }


    public FloatBuffer getVnormBuffer() {
        return vnormBuffer;
    }


    public float[] getVnorms() {
        return vnorms;
    }


    public void setVnorms(float[] vnorms) {
        this.vnorms = vnorms;
        vnormBuffer = Util.floatToBuffer(vnorms);
    }


    public short[] getRemarks() {
        return remarks;
    }


    public void setRemarks(short[] remarks) {
        this.remarks = remarks;
    }




 

}

 

2.Point.java

public class Point {
    public float x;
    public float y;
    public float z;


    public Point(float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;


    }

}

 

3.STLReader.java

public class STLReader {
    private StlLoadListener stlLoadListener;


    public Model parserBinStlInSDCard(String path)
            throws IOException {


        File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        return parserBinStl(fis);
    }


    public Model parserBinStlInAssets(Context context, String fileName)
            throws IOException {


        InputStream is = context.getAssets().open(fileName);
        return parserBinStl(is);
    }
    

    

    public static interface StlLoadListener {
        void onstart();


        void onLoading(int cur, int total);


        void onFinished();


        void onFailure(Exception e);
    }
}

 

 

4.OpenGLESActivity.java

public class OpenGLESActivity extends Activity {


    private GLSurfaceView glView;
    private float rotateDegreen = 0;
    private GLRenderer glRenderer;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 如果本设备支持OpenGl ES 2.0
        if (IsSupported()) {
            glView = new GLSurfaceView(this);
            glRenderer = new GLRenderer(this);
            glView.setRenderer(glRenderer);
            setContentView(glView);
        }else{
            Toast.makeText(OpenGLESActivity.this,"此设备不支持OpenGL ES 2.0!",Toast.LENGTH_LONG).show();
        }
    }


    public void rotate(float degree) {
        glRenderer.rotate(degree);
        glView.invalidate();
    }


    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            rotate(rotateDegreen);
        }
    };




    /**
     * 当前设备是否支持OpenGL ES 2.0
     * */


    private boolean IsSupported() {
        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000
                ||(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 && (Build.FINGERPRINT.startsWith("generic")
                || Build.FINGERPRINT.startsWith("unknown")
                || Build.MODEL.contains("google_sdk")
                || Build.MODEL.contains("Emulator")
                || Build.MODEL.contains("Android SDK built for x86")));
        return supportsEs2;
    }


    /**
     * onPause方法 glSurfaceView.onPause
     * */


    @Override
    protected void onPause() {
        super.onPause();
        if (glView != null) {
            glView.onPause();
        }
    }


    /**
     * onResume方法 glSurfaceView.onResume
     * */


    @Override
    protected void onResume() {
        super.onResume();
        if (glView != null) {
            glView.onResume();


            //不断改变rotateDegreen值,实现旋转
            new Thread() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            sleep(100);


                            rotateDegreen += 5;
                            handler.sendEmptyMessage(0x001);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }


                    }
                }
            }.start();
        }
    }


}

 

 

5.结果

Android API开发之OpenGL开发之Android OpenGL显示STL模型文件_第1张图片

Android API开发之OpenGL开发之Android OpenGL显示STL模型文件_第2张图片

Android API开发之OpenGL开发之Android OpenGL显示STL模型文件_第3张图片

Android API开发之OpenGL开发之Android OpenGL显示STL模型文件_第4张图片

Android API开发之OpenGL开发之Android OpenGL显示STL模型文件_第5张图片

 

Demo下载:https://download.csdn.net/download/weixin_37730482/10449292

更多相关文章

  1. android从未安装的apk文件里获取信息(包信息,资源信息)
  2. android studio R文件找不到
  3. 解决IE apk变成zip:Android 手机应用程序文件下载服务器 配置解决
  4. android 源码下java文件的路径
  5. 后台动态添加布局文件、控件与动态设置属性2
  6. Android 之 使用File类在SD卡中读取数据文件
  7. Android之如何安装(卸载)apk文件到模拟器

随机推荐

  1. Settings中蓝牙连接流程
  2. Activity设置透明背景
  3. Java/Android倒计时(开始,暂停,恢复,停止)
  4. Delphi Android USB声明文件
  5. Android周学习Step By Step(7)--Activity简
  6. Android studio 修改SDK路径
  7. android的socket程序中conn.getResponseC
  8. Android SDK not found 的解决方案
  9. Android之弹出/隐藏系统软键盘
  10. android sqlite加密