模型(Model)
模型系統架構
1. 模型類設計
頭文件 Model.h:
class Model {
public:Model(const std::string& path, bool gamma = false);void Draw(Shader& shader);void Update(float deltaTime);// 變換操作void SetTransform(const glm::mat4& transform);void SetPosition(const glm::vec3& position);void Rotate(float angle, const glm::vec3& axis);void Scale(const glm::vec3& scale);// 動畫控制void PlayAnimation(const std::string& name);void PauseAnimation();void SetAnimationSpeed(float speed);// LOD控制void SetLODLevel(int level);private:std::vector<Mesh> meshes;std::string directory;bool gammaCorrection;// 變換glm::mat4 modelMatrix;// 動畫系統struct AnimationState {const aiAnimation* animation;float currentTime;float speed;bool playing;};std::unordered_map<std::string, AnimationState> animations;std::string currentAnimation;// 骨骼系統std::vector<Bone> bones;std::map<std::string, uint32_t> boneMapping;// LOD系統std::vector<std::vector<Mesh>> lodLevels;int currentLOD;void loadModel(const std::string& path);void processNode(aiNode* node, const aiScene* scene, int lodLevel = 0);Mesh processMesh(aiMesh* mesh, const aiScene* scene);void loadAnimations(const aiScene* scene);void updateBoneTransforms(float time);
};
2. 骨骼系統實現
骨骼結構:
struct Bone {glm::mat4 offsetMatrix;glm::mat4 finalTransformation;std::string name;std::vector<Bone> children;
};// 骨骼影響結構
struct VertexBoneData {uint32_t IDs[4] = {0};float Weights[4] = {0.0f};void AddBoneData(uint32_t boneID, float weight) {for (uint32_t i = 0; i < 4; i++) {if (Weights[i] == 0.0) {IDs