下面介绍一些函数,这里只是列举一下,用的时候非常简单
声明一个三分量的向量
M3DVector3f vector;
声明一个四分量的向量
M3DVector4f vector;
向量点乘,返回角余弦值,在-1到1之间
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v)
向量点乘,返回角的弧度制
float m3dGetAngleBrtweeenVectors3(const M3DVector3f u,const M3DVector3f v)
向量叉乘 ,得到另外一个向量,该向量与原来的两个向量垂直
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u,const M3DVector3f v)
声明一个4*4的矩阵
M3DMatrix44f m = {......}
平移矩阵
void m3dTranslationMatrix44(M3DMatrix44f m,float x,float y,float z)
旋转矩阵
m3dRotationMatrix44(M3DMatrix44f m,float angle,float x,float y,float z)
缩放矩阵
void m3dScaleMatrix44(M3DMatrix44f m,float xScale,float yScale,float zScale)
矩阵相乘
void m3dMatrixMultiply44(M3DMatrix44f product,const M3DMatrix44f a,const M3DMatrix44f b)
矩阵入栈
PushMatrix()
矩阵出栈
PopMatrix()
入栈的矩阵会影响到接下来要绘制的图元,我们会在照相机那一节中看到具体的使用方法
下面我们来写一个例子,按下键盘的上下左右键时,正方形会发生旋转与移动
如下图:
我们来看一下代码实现
首先是包含的文件
#include <GLTools.h>
#include <GLShaderManager.h>
#include <math3d.h>
#define FREEGLUT_STATIC
#include <GL/glut.h>
全局变量部分
GLBatch squareBatch;
GLShaderManager shaderManager;
GLfloat blockSize = 0.1f;
GLfloat vVerts[] = { -blockSize, -blockSize, 0.0f,
blockSize, -blockSize, 0.0f,
blockSize, blockSize, 0.0f,
-blockSize, blockSize, 0.0f};
GLfloat xPos = 0.0f;
GLfloat yPos = 0.0f;
下面是main函数,因为之前讲过很多次这个函数了,所以这次直接贴出代码
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(600, 600);
glutCreateWindow("Move Block with Arrow Keys");
GLenum err = glewInit();
if (GLEW_OK != err)
{
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
return 1;
}
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutSpecialFunc(SpecialKeys);
SetupRC();
glutMainLoop();
return 0;
}
接下来是窗口改变时的回调函数ChangeSize,之前也讲过
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
}
下面是初始化函数SetupRC,前面也讲过
void SetupRC()
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f );
shaderManager.InitializeStockShaders();
//建立三角形图元批次
squareBatch.Begin(GL_TRIANGLE_FAN, 4);
squareBatch.CopyVertexData3f(vVerts);
squareBatch.End();
}
下面具体来看一下渲染函数RenderScene,代码注释的很详细
void RenderScene(void)
{
//清除缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//声明三个矩阵 其中mTranslationMatrix 是移动矩阵,
//mRotationMatrix是旋转矩阵,mFinalTransform是前两个矩阵的乘积
M3DMatrix44f mFinalTransform, mTranslationMatrix, mRotationMatrix;
//给移动矩阵mTranslationMatrix赋值
m3dTranslationMatrix44(mTranslationMatrix, xPos, yPos, 0.0f);
//给旋转矩阵mRotationMatrix赋值
static float yRot = 0.0f;
yRot += 5.0f;
m3dRotationMatrix44(mRotationMatrix, m3dDegToRad(yRot), 0.0f, 0.0f, 1.0f);
//m3dMatrixMultiply44标示第二个参数乘以第三个参数,结果赋值给第一个参数
m3dMatrixMultiply44(mFinalTransform, mTranslationMatrix, mRotationMatrix);
//设置着色器,其中第二个参数是个矩阵,可以影响到三角形的每个定点
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_FLAT, mFinalTransform, vRed);
//绘制图元
squareBatch.Draw();
glutSwapBuffers();
}
下面是键盘按键的响应回调函数
void SpecialKeys(int key, int x, int y)
{
GLfloat stepSize = 0.025f;
if(key == GLUT_KEY_UP)
yPos += stepSize;
if(key == GLUT_KEY_DOWN)
yPos -= stepSize;
if(key == GLUT_KEY_LEFT)
xPos -= stepSize;
if(key == GLUT_KEY_RIGHT)
xPos += stepSize;
if(xPos < (-1.0f + blockSize))
xPos = -1.0f + blockSize;
if(xPos > (1.0f - blockSize)) xPos = 1.0f - blockSize;
if(yPos < (-1.0f + blockSize)) yPos = -1.0f + blockSize;
if(yPos > (1.0f - blockSize)) yPos = 1.0f - blockSize;
glutPostRedisplay();
}