模型(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