这一篇接着来一步步实现。
本篇主要是介绍矩阵,并推导渲染流水管线中使用的缩放、旋转、平移矩阵,然后利用C++实现它,并且做一个简单的小游戏(使用平移、旋转、缩放)
1.首先介绍矩阵并实现它
理论:
C++代码实现:matrix3
#pragma once
#include "vector2.h"
//此处的宏定义主要是为了读者能区分矩阵元素的位置
#define _M_11 0
#define _M_12 1
#define _M_13 2
#define _M_21 3
#define _M_22 4
#define _M_23 5
#define _M_31 6
#define _M_32 7
#define _M_33 8
class Matrix3
{
public:
float m[9];
//构造
Matrix3()
{
//默认为单位矩阵
Identity();
}
//单位化
Matrix3& Identity()
{
for (int i = 0; i < 9; ++i)
m[i] = 0.0f;
m[_M_11] = m[_M_22] = m[_M_33] = 1.0f;
return *this;
}
//平移
Matrix3& Translate(float x, float y)
{
m[_M_11] = 1.0f; m[_M_12] = 0.0f; m[_M_13] = 0.0f;
m[_M_21] = 0.0f; m[_M_22] = 1.0f; m[_M_23] = 0.0f;
m[_M_31] = x; m[_M_32] = y; m[_M_33] = 1.0f;
return *this;
}
Matrix3& Translate(Vector2 v)
{
m[_M_11] = 1.0f; m[_M_12] = 0.0f; m[_M_13] = 0.0f;
m[_M_21] = 0.0f; m[_M_22] = 1.0f; m[_M_23] = 0.0f;
m[_M_31] = v.x; m[_M_32] = v.y; m[_M_33] = 1.0f;
return *this;
}
//旋转
Matrix3& Rotation(float angle)
{
m[_M_11] = cos(angle); m[_M_12] = sin(angle); m[_M_13] = 0.0f;
m[_M_21] = -m[_M_12]; m[_M_22] = m[_M_11]; m[_M_23] = 0.0f;
m[_M_31] = 0.0f; m[_M_32] = 0.0f; m[_M_33] = 1.0f;
return *this;
}
//缩放
Matrix3& Scale(float x, float y)
{
m[_M_11] = x; m[_M_12] = 0.0f; m[_M_13] = 0.0f;
m[_M_21] = 0.0f; m[_M_22] = y; m[_M_23] = 0.0f;
m[_M_31] = 0.0f; m[_M_32] = 0.0f; m[_M_33] = 1.0f;
return *this;
}
Matrix3& Scale(Vector2 v)
{
m[_M_11] = v.x; m[_M_12