创建组件类文件
#pragma once
#ifndef __GAME_COMPONENT_H__
#define __GAME_COMPONENT_H__

//定义一些组件的类型
enum emComponentType
{
    ComType_None,  //空类型
    ComType_Transform, // 坐标变换组件
    ComType_MeshRender, //渲染组件
    ComType_Camera, // 摄像机组件
    ComType_Light, //灯光组件
    //...
};

//使用前置声明游戏对象类
class GameObject;

typedef class Component
{
public:
    virtual ~Component() = default; //创建默认析构
    Component(const Component& that) = delete; //删除拷贝功能
    Component& operator = (const Component& that) = delete;//删除赋值功能
    //初始化类型
    Component(GameObject* pObject)
    {
        mType = emComponentType::ComType_None;
        mOwner = pObject;
    }

    emComponentType Type() { return mType; }// 获取组件类型
    GameObject* gameobject() { return mOwner; }//获取持有对象
protected:
    GameObject* mOwner;//谁持有该组件
    emComponentType mType;//组件的类型
}COMPONENT,*LPCOMPONENT;
#endif

创建Obj 对象类文件,每一个游戏对象至少都应该有这么唯一的一个tansform组件

#pragma once
#ifndef __GAME_OBJECT_H__
#define __GAME_OBJECT_H__
#include "Transform.h"
#include <vector>

class GameObject
{
public:
    //初始
    GameObject()
    {
        //创建transform组件
        mpTransform = nullptr;
        mpTransform = (Transform*)AddComponent(emComponentType::ComType_Transform);
    }
    virtual ~GameObject()
    {
        //将创建的组件释放
    }

    //增加组件的功能
    //如果不为空返回,为空则创建
    LPCOMPONENT AddComponent(emComponentType t)
    {
        switch (t)
        {
        case emComponentType::ComType_Transform:
        {
            if (mpTransform!=nullptr)
            {
                return mpTransform;
            }
            mpTransform = new Transform(this);
            return mpTransform;
        }break;
        case emComponentType::ComType_Camera:
        {

        }break;
        case emComponentType::ComType_MeshRender:
        {

        }break;
        case emComponentType::ComType_Light:
        {

        }break;
        default:
        {

        }
        }
        return nullptr;
    }
    //获取组件的功能
    LPCOMPONENT GetComponent(emComponentType t)
    {
        if (t == emComponentType::ComType_Transform)
        {
            return mpTransform;
        }
        for (auto& itr:mComponents)
        {
            if (itr->Type() == t)
            {
                return itr;
            }
        }
        return nullptr;
    }
    //删除组件的功能
    void RemoveComponent(emComponentType t)
    {
        if (t == emComponentType::ComType_Transform) { return; }
        for (auto it = mComponents.begin();it!=mComponents.end();it++)
        {
            if ((*it)->Type() == t)
            {
                delete* it;
                mComponents.erase(it);
                return;
            }
        }
    }

    Transform& transform() { return *mpTransform; }
protected:
    Transform* mpTransform;//每一个游戏对象至少都应该有这么唯一的一个tansform组件
    std::vector<LPCOMPONENT> mComponents;//组件存储除了transform的所有的组件
};
#endif

创建Transform 坐标变换组件对象类

#pragma once
#ifndef __GAME_COMPONENT_TRANSFORM_H__
#define __GAME_COMPONENT_TRANSFORM_H__
#include "Component.h"
#include "Matrix4x4.h"

class Transform:public Component
{
public:
    //必须使用初始化列表的方式初始化父类唯一的带参构造
    Transform(GameObject* pObj) :Component(pObj)
    {
        mType = emComponentType::ComType_Transform;
        mPosition = vector3d::Zero();
        mScale = vector3d::One();
        mRotation = vector3d::Zero();

        //凡是修改了位置、缩放、旋转的成员值,都应该调用对应的矩阵更新函数
        _update_Matrix_Translate();
        _update_Matrix_Scale();
        _update_Matrix_Rotate();
    }

    //获取变换组件成员 函数
    vector3d forward() { return mZ; }
    vector3d back() { return -mZ; }
    vector3d right() { return mX; }
    vector3d left() { return -mX; }
    vector3d up() { return mY; }
    vector3d down() { return -mY; }

    const vector3d& localScale() { return mScale; }
    const vector3d& position() { return mPosition; }
    const vector3d& rotation() { return mRotation; }

    Matrix4x4& MatT() { return MatrixTranslate; }
    Matrix4x4& MatS() { return MatrixScale; }
    Matrix4x4& MatR() { return MatrixRotate; }

    //修改成员变量函数 ,每次修改都应该调用对应的矩阵更新函数
    void SetPosition(const vector3d& v)
    {
        mPosition = v;
        _update_Matrix_Translate();
    }
    void SetScale(const vector3d& v)
    {
        mScale = v;
        _update_Matrix_Scale();
    }
    void SetRotation(const vector3d& v)
    {
        mRotation = v;
        _update_Matrix_Rotate();
    }
    void translate(const vector3d& tv)
    {
        mPosition += tv;
        _update_Matrix_Translate();
    }
    void scale(const vector3d& ts)
    {
        mScale *= ts;
        _update_Matrix_Scale();
    }
    void rotate(const vector3d& v);
protected:
    //凡是修改了位置、缩放、旋转的成员值,都应该调用对应的矩阵更新函数
    void _update_Matrix_Translate();
    void _update_Matrix_Scale();
    void _update_Matrix_Rotate();
protected:
    vector3d mPosition; //位置
    vector3d mScale;//缩放
    vector3d mRotation; //旋转
    vector3d mX, mY, mZ;

    Matrix4x4 MatrixTranslate;//平移矩阵
    Matrix4x4 MatrixScale;//缩放矩阵
    Matrix4x4 MatrixRotate;//旋转矩阵
};

#endif
#include "Transform.h"
#include "GameObject.h"

void Transform::rotate(const vector3d& v)
{
    //将角度转换为弧度
    vector3d angle_r = v * 0.01745329f;//M_PI/180;
    //使用每一个轴旋转角度得到对应的旋转矩阵
    Matrix4x4 _mx; _mx.SetRotateX_r(angle_r.x);
    Matrix4x4 _my; _my.SetRotateY_r(angle_r.y);
    Matrix4x4 _mz; _mz.SetRotateZ_r(angle_r.z);

    //欧拉角的旋转顺序有6中 xyz,xzy,yxz,yzx,zxy,zyx
    //我们选取zxy顺序进行旋转
    Matrix4x4 _mr = _mz * _mx * _my;
    //在这个基础上得到完整的旋转矩阵
    MatrixRotate *= _mr;
    Matrix4x4& r = MatrixRotate;

    //根据正交矩阵的性质,对应轴向的矩阵的转置矩阵为其旋转矩阵
    mX.x = r._11; mY.x = r._12; mZ.x = r._13;
    mX.y = r._21; mY.y = r._22; mZ.y = r._23;
    mX.z = r._31; mY.z = r._32; mZ.z = r._33;

    mX.Normalize();
    mY.Normalize();
    mZ.Normalize();

    //需要根据当前的数据求解欧拉角
    double sy = sqrt(r._11 * r._11 + r._21 * r._21);
    bool singular = sy < 1e-6;//1e-6使用的是科学计数法表示的 0.000001

    if (!singular)
    {
        mRotation.x = atan2(r._32, r._32);
        mRotation.y = atan2(-r._31, sy);
        mRotation.z = atan2(r._21, r._11);
    }
    else
    {
        mRotation.x = atan2(r._23, r._22);
        mRotation.y = atan2(-r._31, sy);
        mRotation.z = 0;
    }

    //将弧度转换为角度
    mRotation *= 57.2957795f;
}

void Transform::_update_Matrix_Translate()
{
    MatrixTranslate.SetTranslate(mPosition);
}

void Transform::_update_Matrix_Scale()
{
    MatrixScale.SetScale(mScale);
}

void Transform::_update_Matrix_Rotate()
{
    //将角度转换为弧度
    vector3d angle_r = mRotation * 0.01745329f;//M_PI/180;
    //使用每一个轴旋转角度得到对应的旋转矩阵
    Matrix4x4 _mx; _mx.SetRotateX_r(angle_r.x);
    Matrix4x4 _my; _my.SetRotateY_r(angle_r.y);
    Matrix4x4 _mz; _mz.SetRotateZ_r(angle_r.z);

    //欧拉角的旋转顺序有6中 xyz,xzy,yxz,yzx,zxy,zyx
    //我们选取zxy顺序进行旋转
    MatrixRotate = _mz * _mx * _my;

    Matrix4x4& r = MatrixRotate;

    //根据正交矩阵的性质,对应轴向的矩阵的转置矩阵为其旋转矩阵
    mX.x = r._11; mY.x = r._12; mZ.x = r._13;
    mX.y = r._21; mY.y = r._22; mZ.y = r._23;
    mX.z = r._31; mY.z = r._32; mZ.z = r._33;

    mX.Normalize();
    mY.Normalize();
    mZ.Normalize();
}