头文件
vmath.h
#ifndef _VMATH_H
#define _VMATH_H
#ifdef _cplusplus
extern "C" {
#endif
typedef float Matrix44f[16];
void translate(Matrix44f M, float x, float y, float z);
void scale(Matrix44f M, float x, float y, float z);
void rotateX(Matrix44f M, float radian);
void rotateY(Matrix44f M, float radian);
void rotateZ(Matrix44f M, float radian);
void rotateXYZ(Matrix44f M, float radian, float x, float y, float z);
void perspectiveFrustum(Matrix44f M, float left, float right, float top, float bottom, float near, float far); //透视投影
void orthoPerspect(Matrix44f M, float left, float right, float top, float bottom, float near, float far); //正交投影
#ifdef _cplusplus
}
#endif
#endif
实现文件vmath.c
#include
#include
#include
#include "vmath.h"
/
//
void translate(Matrix44f M, float x, float y, float z)
{
int i;
for(i= 0; i <16; i++)
M[i] =0;
M[3] =x;
M[7] =y;
M[11] =z;
M[15] =1.0;
}
/
/
void scale(Matrix44f M, float x, float y, float z)
{
int i;
for(i= 0; i <16; i++)
M[i] =0;
M[0] =x;
M[5] =y;
M[10] =z;
M[15] =1.0;
}
///
void rotateX(Matrix44f M, float radian)
{
int i;
for(i= 0; i <16; i++)
M[i] =0;
M[0] =1.0;
M[5] =cos(radian);
M[6] =sin(radian);
M[9] =-sin(radian);
M[10] =cos(radian);
M[15] =1.0;
}
void rotateY(Matrix44f M, float radian)
{
int i;
for(i= 0; i <16; i++)
M[i] =0;
M[0] =cos(radian);
M[2] =-sin(radian);
M[5] =1.0;
M[8] =sin(radian);
M[10] =cos(radian);
M[15] =1.0;
}
/
/
void rotateZ(Matrix44f M, float radian)
{
int i;
for(i= 0; i <16; i++)
M[i] =0;
M[0] =cos(radian);
M[1] =-sin(radian);
M[4] =sin(radian);
M[5] =cos(radian);
M[10] =1.0;
M[15] =1.0;
}
/
//
void rotateXYZ(Matrix44f M, float radian, float x, float y, float z)
{
int i;
for(i= 0; i <16; i++)
M[i] =0;
}
void perspectiveFrustum(Matrix44f M, float left, float right, float top, float bottom, float near, float far)
{
int i;
for(i= 0; i <16; i++)
M[i] =0;
M[0] =2*near/(right -left);
M[2] =(right +left)/(right -left);
M[5] =2*near/(top -bottom);
M[6] =(top +bottom)/(top -bottom);
M[10] =(near +far)/(near -far);
M[11] =2*near*far/(near -far);
M[14] =-1.0;
}
void orthoPerspect(Matrix44f M, float left, float right, float top, float bottom, float near, float far)
{
int i;
for(i= 0; i <16; i++)
M[i] =0;
M[0] =2/(right -left);
M[3] =(left +right)/(left -right);
M[5] =2/(top -bottom);
M[7] =(bottom +top)/(bottom -top);
M[10] =2/(near -far);
M[11] =(near +far)/(far -near);
M[15] =1.0;
}
绕任意轴旋转的矩阵尚未写!
编译好的静态库可至我的资源下载,使用VC++2008.
原文:http://blog.csdn.net/lelieven/article/details/19157797