心若止水,无坚不摧。
为了绘制一个3D立体模型,你需要掌握一下知识点:
1、GLSurfaceview
2、渲染器render
3、管线渲染的流程
4、着色器编程
看这个链接,了解基本语法
https://blog.csdn.net/xuyankuanrong/article/details/79998061
5、坐标系变换
感觉这个链接对三种坐标系(view坐标系,world坐标系,model坐标系)讲述的特别好:
https://blog.csdn.net/zhongjling/article/details/8488844
6、投影
不太懂的童鞋请度娘, 透视投影(perspective)和正交投影(Orthodox)
7、光照
感觉这个链接对光照讲述的特别好:https://blog.csdn.net/u012325397/article/details/49668641
本文用到的点坐标数据和着色器代码数据保存在文件里面,文中仅仅给出了着色器代码数据。
本文类图如下:
一、MainActivity部分
glsurfaceview可简单的理解为类似button,textview等的组件,它的父类是view类,可以设置宽度和高度等属性值,只是他是用来显示的,也就是说3d模型仅仅会显示在glsurfaceview所限定的区域内
GLSurfaceView的使用有两种方式
1、直接在onCreate()函数里new一个
2、在main_activity里面
<android.opengl.GLSurfaceView
android:id="@+id/glSurfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
public class MainActivity extends AppCompatActivity {
private GLSurfaceView glSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
glSurfaceView=new T3DModelSurfaceView(this);
setContentView(glSurfaceView);
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
protected void onResume(){
super.onResume();
glSurfaceView.onResume();
}
protected void onPause(){
super.onPause();
glSurfaceView.onPause();
}
}
二、T3DSurfaceView部分
语文中,渲染的意思是画国画时用水墨或淡色涂抹画面以加强艺术效果。可以增强氛围,使人感觉情景更加真实。
同理,在这里glsurfaceview就是我们的画,可以通过setRender()来设置渲染器,加强艺术效果。例如可以给surfaceview渲染一层黑色
(1)旋转和缩放实现如下
package zhx.com.glsv;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;
public class T3DModelSurfaceView extends GLSurfaceView {
private float mPreviousX;
private float mPreviousY;
float scale = 0.01f ;
float startDist=0;
float endDist=0;
private TriangleRender render;
public T3DModelSurfaceView(Context context){
super(context);
//设置渲染器
render=new TriangleRender();
setEGLContextClientVersion(2);