OpenGL ES相关库加载3D 车辆模型

需求类似奇瑞的这个效果,就是能全方位旋转拖拽看车,以及点击开关车门车窗后备箱等 瑞虎9全景看车 (chery.cn)

最开始收到这个需求的时候还有点无所适从,因为以前没有做过类似的效果,后面一经搜索后发现实现的方式五花八门,但始终绕不过opengl,于是通过opengl 逐步展开…

1、推荐一个学习OpenglGL 基础操作的文章

OpenGL ES_york2017的博客-CSDN博客 里面有一些基本的操作和概念,可以作为像我这样完全没有接触过opengl 的小白入手,一套文章看下来也熟悉了一些基本的接口,比如,添加一个灯光、网格线、obj模型、awd模型等,在后面的库中能用得着

2.1、OpenGL ES 封装库 – Rajawali

Rajawali-github

由于我是一个纯Java er,对c++不熟悉,所以试了一下这个纯Java语言的封装库,从他的demo例子来看是可以实现我的需求的,但是当我仔细看代码的时候,发现加载骨骼动画的方式只能通过加载 .md5mesh 和 .fbx 文件,但是,我搜索良久,也没有找到 .md5mesh 文件后缀的免费的车辆模型(当然要白嫖拉),于是尝试使用 .fbx的方式,但是demo里面并没有做这种方式的例子,于是我自己写了一个,然后就 报错了,在库github的issue里面也找到了一些类似的提问,但是并没有解决,似乎是说不支持这种方式,索性开发人员就直接抛出了一个异常 FBX Loader Issue · Issue #2303 ,如果有大佬找到了用rajawali加载fbx文件的告诉我一声,感谢~

进入正题:

Rajawali的 github 下载下来可以直接运行,如果问题的话可以留言一起沟通下,运行出来如图所示:

OpenGL ES相关库加载3D 车辆模型_第1张图片

2.2 加载obj模型

先看效果:
OpenGL ES相关库加载3D 车辆模型_第2张图片

这里只给出主要的initScene的代码,完整代码可以在 这里查看
注释和需要注意的点都在代码里面有所体现,这里就不细说了

protected void initScene() {
            try {
                PointLight light = new PointLight();
                light.setPosition(0, 10, 4);
                light.setPower(3);
                getCurrentScene().addLight(light);

                DirectionalLight directionalLight = new DirectionalLight();
                directionalLight.setLookAt(0, 5, 10);
                directionalLight.setPower(3);
                getCurrentScene().addLight(directionalLight);

                //加载obj文件需要注意的点:
                //一、加载obj文件的时候,如果有纹理文件.mtl ,mtl文件里面的png 图片需要放在drawable 里面才能被识别到,如果放到mipmap的话是识别不到的。
                //二、mtl文件的命名格式为xxx_mtl,是没有后缀的,而在.obj文件里面引用mtl文件的时候则是需要   xxx.mtl
                LoaderOBJ loaderOBJ = new LoaderOBJ(getResources(), mTextureManager, R.raw.freigther_bi_export_obj);//multiobjects_obj
                loaderOBJ.parse();
                Object3D object3D = loaderOBJ.getParsedObject();
                getCurrentScene().addChild(object3D);
                object3D.setScale(0.5);

                //设置拖拽功能
                ArcballCamera arcballCamera = new ArcballCamera(getContext(), getActivity().findViewById(R.id.fl_empty));
                //设置相机的位置
                arcballCamera.setPosition(1, 7, 10);
                //替换当前场景下的相机,第一个参数的旧的相机,第二个是新的
                getCurrentScene().replaceAndSwitchCamera(getCurrentCamera(), arcballCamera);

                //车辆自旋转
                Animation3D animation3D = new RotateOnAxisAnimation(Vector3.Axis.Y, 360);
                //一圈时间
                animation3D.setDurationMilliseconds(8000);
               /* 设置旋转重复类型:
                    NONE:无,转一圈后会停止
                    INFINITE:一直旋转
                    RESTART:转一圈后停止
                    REVERSE:转一圈后停止
                    REVERSE_INFINITE:顺时针一圈,逆时针一圈,如此循环
                 */
                animation3D.setRepeatMode(Animation.RepeatMode.INFINITE);
                animation3D.setTransformable3D(object3D);
                getCurrentScene().registerAnimation(animation3D);
//                animation3D.play();

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
2.3 加载fbx模型

前面说过,这个加载不了3d模型,似乎是由于框架的限制问题,所以也不细说了

3 libGdx 加载3d模型

LibGDX-github
也是一个高star的3d引擎框架,但是苦于没有中文文档让我很难受,相关3d资料较少,看了基于libgdx的一些例子似乎都是2d的产品较多,其中一个例子运行出来是这样的,不太满足我的需求,也没找到合适的3d的例子,找到的小伙伴给我说一下,感谢~
OpenGL ES相关库加载3D 车辆模型_第3张图片

总结:
目前没有实现加载带有骨骼动画的3D车辆模型这个功能,如果有大佬有做过类似需求的请留言沟通,不胜感激。

你可能感兴趣的:(Android,3d)