OpenGL数学知识

下面介绍一些函数,这里只是列举一下,用的时候非常简单


声明一个三分量的向量

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();
	}
















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值