iOS笔记 - 安装包瘦身
712 2023-04-03 05:08:46
#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();}