该案例主要是对常见的图元连接方式的运用,常见的基本图元连接方式见此链接
最终实现的效果如图所示:
主要对其中三个函数进行一些说明
在之前的demo中,changeSize主要是用来设置视口大小以及当视口发生变化时调用的,而本案例中立体图形的绘制需要使用投影矩阵,因此需要在该函数中设置投影矩阵
主要涉及以下几个步骤
//参数1:垂直方向上的视场角度
//参数2:视口纵横比 = w/h
//参数3:近裁剪面距离
//参数4:远裁剪面距离
viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 500.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
modelViewMatrix.LoadIdentity();
从流程图上可以看出,除了基本的背景色设置,存储着色器初始化以及顶点数据的创建及传输外,还需要对阵矩阵及观察者做一下设置
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
其中,变换管道通过get可获得的矩阵有4种
方法 | 说明 |
---|---|
GetProjectionMatrix() | 投影矩阵 |
GetNormalMatrix() | 法线矩阵 |
GetModelViewMatrix() | 模型视图矩阵,简称mv |
GetModelViewProjectionMatrix() | 模型视图投影矩阵,简称mvp |
cameraFrame.MoveForward(-15.0f);
观察者位置的设置有三种
方法 | 说明 |
---|---|
void MoveForward(float fDelta) | 向外移动的像素点,修改z |
void MoveUp(float fDelta) | 向上移动的像素点,修改y |
void MoveRight(float fDelta) | 向右移动的像素点,修改x |
从流程图中可以看出,这个过程是将物体坐标转换为裁剪坐标,然后经过OpenGL的处理,转换为NDC,并显示到屏幕上的一个过程。在此过程中栈的变化如下所示
modelViewMatrix.PushMatrix();
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
具体代码见Github OpenGL点/线…