1. 程式人生 > >OpenGL圖形編程實現2D變換

OpenGL圖形編程實現2D變換

所有 [1] clu 結果 基本 圖形 amp for 幾何變換

二維幾何變換相比三維略簡單一點但原理基本一致,下列代碼實現了平移、縮放、旋轉變換,並有一個復合變換矩陣保存所有變換計算後的結果,方便用其結果在OpenGL進行渲染

#include <GL/glew.h>
#include <cmath>

class wcPt2D {
public:
	GLfloat x, y;
};

typedef GLfloat Matrix3x3[3][3];
const GLdouble pi = 3.14159;

Matrix3x3 matComposite;

void matrix3x3SetIdentity(Matrix3x3 &matIdent3x3)
{
	GLint row, col;

	for (row = 0; row < 3; ++row)
	{
		for (col = 0; col < 3; ++col)
		{
			matIdent3x3[row][col] = (row == col);
		}
	}
}

void matrix3x3PreMultiply(Matrix3x3 m1, Matrix3x3 m2)
{
	GLint row, col;
	Matrix3x3 matTemp;

	for (row = 0; row < 3; ++row)
	{
		for (col = 0; col < 3; ++col)
		{
			matTemp[row][col] = m1[row][0] * m2[0][col] + m1[row][1] *
				m2[1][col] + m1[row][2] * m2[2][col];
		}
	}
	for (row = 0; row < 3; ++row)
	{
		for (col = 0; col < 3; ++col)
		{
			m2[row][col] = matTemp[row][col];
		}
	}
}

void translate2D(GLfloat tx, GLfloat ty)
{
	Matrix3x3 matTransl;
	matrix3x3SetIdentity(matTransl);

	matTransl[0][2] = tx;
	matTransl[1][2] = ty;

	matrix3x3PreMultiply(matTransl, matComposite);
}

void rotate2D(wcPt2D pivotPt, GLfloat theta)
{
	Matrix3x3 matRot;

	matrix3x3SetIdentity(matRot);
	matRot[0][0] = cos(theta);
	matRot[0][1] = -sin(theta);
	matRot[0][2] = pivotPt.x * (1 - cos(theta)) + pivotPt.y * sin(theta);
	matRot[1][0] = sin(theta);
	matRot[1][1] = cos(theta);
	matRot[1][2] = pivotPt.y * (1 - cos(theta)) - pivotPt.x * sin(theta);

	matrix3x3PreMultiply(matRot, matComposite);
}

void scale2D(GLfloat sx, GLfloat sy, wcPt2D fixedPt)
{
	Matrix3x3 matScale;

	matrix3x3SetIdentity(matScale);

	matScale[0][0] = sx;
	matScale[0][2] = (1 - sx) * fixedPt.x;
	matScale[1][1] = sy;
	matScale[1][2] = (1 - sy) * fixedPt.y;

	matrix3x3PreMultiply(matScale, matComposite);
}

void transformVerts2D(GLint nVerts, wcPt2D *verts)
{
	GLint k;
	GLfloat temp;
	for (k = 0; k < nVerts; ++k)
	{
		temp = matComposite[0][0] * verts[k].x + matComposite[0][1] *
			verts[k].y + matComposite[0][2];
		verts[k].y = matComposite[1][0] * verts[k].x + matComposite[1][1] *
			verts[k].y + matComposite[1][2];
		verts[k].x = temp;
	}
}

OpenGL圖形編程實現2D變換