From 210f7a3bf375b246af4e514c512b7af2ebf837bc Mon Sep 17 00:00:00 2001 From: wuyize Date: Sun, 4 Jun 2023 00:59:02 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3Model=E5=8F=98=E6=8D=A2?= =?UTF-8?q?=E7=B4=AF=E8=AE=A1=E8=AF=AF=E5=B7=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Exp1/ModelWorld.cpp | 10 --- Exp1/ModelWorld.h | 2 - Exp2/Exp2.vcxproj | 3 + Exp2/Exp2.vcxproj.filters | 3 + Exp2/ModelWorld.cpp | 24 ++----- Exp2/ModelWorld.h | 2 - Exp3/ParticleWorld.cpp | 39 +++++----- Exp3/ParticleWorld.h | 4 +- ToyEngine/ToyEngine.vcxproj | 39 +++++----- ToyEngine/ToyEngine.vcxproj.filters | 107 ++++++++++++++-------------- ToyEngine/src/MainWindow.cpp | 5 +- ToyEngine/src/Mesh.h | 2 +- ToyEngine/src/Model.cpp | 24 +++---- ToyEngine/src/Model.h | 4 +- ToyEngine/src/Particle.cpp | 11 ++- 15 files changed, 123 insertions(+), 156 deletions(-) diff --git a/Exp1/ModelWorld.cpp b/Exp1/ModelWorld.cpp index 9b33451..3d7ec9c 100644 --- a/Exp1/ModelWorld.cpp +++ b/Exp1/ModelWorld.cpp @@ -14,16 +14,6 @@ ModelWorld::ModelWorld() camera.Position = { 0,10,20 }; } -void ModelWorld::logicalTick(float deltaTime) -{ - World::logicalTick(deltaTime); -} - -void ModelWorld::rendererTick(float deltaTime) -{ - World::rendererTick(deltaTime); -} - void ModelWorld::cursorPosCallback(GLFWwindow* window, double xpos, double ypos) { static bool firstMouse = true; diff --git a/Exp1/ModelWorld.h b/Exp1/ModelWorld.h index 4709891..1e6bc2c 100644 --- a/Exp1/ModelWorld.h +++ b/Exp1/ModelWorld.h @@ -5,8 +5,6 @@ class ModelWorld : public World { public: ModelWorld(); - void logicalTick(float deltaTime) override; - void rendererTick(float deltaTime) override; virtual void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) override; virtual void scrollCallback(GLFWwindow* window, double xoffset, double yoffset) override; virtual void processInput(GLFWwindow* window, float deltaTime) override; diff --git a/Exp2/Exp2.vcxproj b/Exp2/Exp2.vcxproj index ef5fea0..77f3cde 100644 --- a/Exp2/Exp2.vcxproj +++ b/Exp2/Exp2.vcxproj @@ -150,6 +150,9 @@ + + + diff --git a/Exp2/Exp2.vcxproj.filters b/Exp2/Exp2.vcxproj.filters index d6ddcad..c260086 100644 --- a/Exp2/Exp2.vcxproj.filters +++ b/Exp2/Exp2.vcxproj.filters @@ -27,4 +27,7 @@ 头文件 + + + \ No newline at end of file diff --git a/Exp2/ModelWorld.cpp b/Exp2/ModelWorld.cpp index 8ae6712..6d1f0fc 100644 --- a/Exp2/ModelWorld.cpp +++ b/Exp2/ModelWorld.cpp @@ -6,23 +6,12 @@ ModelWorld::ModelWorld() light.lightDirection = glm::normalize(glm::vec3((cos(lightPitch) * cos(lightYaw)), (sin(lightPitch)), (cos(lightPitch) * sin(lightYaw)))); light.radiance = 3.f * lightColor; RenderingSystem::instance().exposure = 0.45f; + camera.Position = { 0,5,10 }; model = std::make_shared("Models/David_Brown_25D_tractor_SF/David_Brown_25D_tractor_SF.obj"); model->setPosition({ 0,0,0 }); model->setScale(glm::vec3(0.5)); addActor(model); - - camera.Position = { 0,5,10 }; -} - -void ModelWorld::logicalTick(float deltaTime) -{ - World::logicalTick(deltaTime); -} - -void ModelWorld::rendererTick(float deltaTime) -{ - World::rendererTick(deltaTime); } void ModelWorld::cursorPosCallback(GLFWwindow* window, double xpos, double ypos) @@ -74,13 +63,14 @@ void ModelWorld::processInput(GLFWwindow* window, float deltaTime) if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) camera.processKeyboard(DOWN, deltaTime); - float speed = 0.1; + float speed = 10; + float d = speed * deltaTime; if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) - model->setPosition(model->getPosition() + glm::vec3(0, 0, -speed)); + model->setPosition(model->getPosition() + glm::vec3(0, 0, -d)); if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) - model->setPosition(model->getPosition() + glm::vec3(0, 0, speed)); + model->setPosition(model->getPosition() + glm::vec3(0, 0, d)); if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) - model->setPosition(model->getPosition() + glm::vec3(-speed, 0, 0)); + model->setPosition(model->getPosition() + glm::vec3(-d, 0, 0)); if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS) - model->setPosition(model->getPosition() + glm::vec3(speed, 0, 0)); + model->setPosition(model->getPosition() + glm::vec3(d, 0, 0)); } diff --git a/Exp2/ModelWorld.h b/Exp2/ModelWorld.h index 4709891..1e6bc2c 100644 --- a/Exp2/ModelWorld.h +++ b/Exp2/ModelWorld.h @@ -5,8 +5,6 @@ class ModelWorld : public World { public: ModelWorld(); - void logicalTick(float deltaTime) override; - void rendererTick(float deltaTime) override; virtual void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) override; virtual void scrollCallback(GLFWwindow* window, double xoffset, double yoffset) override; virtual void processInput(GLFWwindow* window, float deltaTime) override; diff --git a/Exp3/ParticleWorld.cpp b/Exp3/ParticleWorld.cpp index 7b76c2c..75fe708 100644 --- a/Exp3/ParticleWorld.cpp +++ b/Exp3/ParticleWorld.cpp @@ -42,18 +42,18 @@ ParticleWorld::ParticleWorld() } { - planet = std::make_shared(100); - planet->setPosition({ -10,0,0 }); - planet->setFixed(true); + star = std::make_shared(100); + star->setPosition({ -10,0,0 }); + star->setFixed(true); - auto p1 = std::make_shared(1); - p1->setPosition({ -15,0,0 }); - p1->setSpeed(glm::vec3(0, 0, 1) * glm::sqrt(G * planet->getMass() / glm::distance(planet->getPosition(), p1->getPosition()))); + auto p = std::make_shared(1); + p->setPosition({ -15,0,0 }); + p->setSpeed(glm::vec3(0, 0, 1) * glm::sqrt(G * star->getMass() / glm::distance(star->getPosition(), p->getPosition()))); - addActor(planet); - addActor(p1); + addActor(star); + addActor(p); - physicsManager.addGravitation(planet, p1, G); + physicsManager.addGravitation(star, p, G); } } @@ -75,18 +75,6 @@ void ParticleWorld::rendererTick(float deltaTime) } else iter++; } - - if (addNewParticle) - { - addNewParticle = false; - - auto p = std::make_shared(1); - p->setPosition(camera.Position + glm::vec3(0, -0.3, 0)); - p->setSpeed(5.f * glm::normalize(camera.Front)); - addActor(p); - physicsManager.addGravitation(planet, p, G); - particles.push_back(p); - } } void ParticleWorld::cursorPosCallback(GLFWwindow* window, double xpos, double ypos) @@ -114,7 +102,14 @@ void ParticleWorld::cursorPosCallback(GLFWwindow* window, double xpos, double yp void ParticleWorld::mouseButtonCallback(GLFWwindow* window, int button, int action, int mods) { if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) - addNewParticle = true; + { + auto p = std::make_shared(1); + p->setPosition(camera.Position + glm::vec3(0, -0.3, 0)); + p->setSpeed(5.f * glm::normalize(camera.Front)); + addActor(p); + physicsManager.addGravitation(star, p, G); + particles.push_back(p); + } } void ParticleWorld::scrollCallback(GLFWwindow* window, double xoffset, double yoffset) diff --git a/Exp3/ParticleWorld.h b/Exp3/ParticleWorld.h index 5b283af..0a0769e 100644 --- a/Exp3/ParticleWorld.h +++ b/Exp3/ParticleWorld.h @@ -13,13 +13,11 @@ public: private: std::vector> particles; - std::shared_ptr planet; + std::shared_ptr star; float G = 1; glm::vec3 lightColor = glm::normalize(glm::vec3(0.7529, 0.7450, 0.6784)); float lightYaw = glm::radians(80.f); float lightPitch = glm::radians(105.f); - - bool addNewParticle = false; }; diff --git a/ToyEngine/ToyEngine.vcxproj b/ToyEngine/ToyEngine.vcxproj index ea63187..49d126d 100644 --- a/ToyEngine/ToyEngine.vcxproj +++ b/ToyEngine/ToyEngine.vcxproj @@ -59,25 +59,26 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + 16.0 diff --git a/ToyEngine/ToyEngine.vcxproj.filters b/ToyEngine/ToyEngine.vcxproj.filters index 0be9677..840af3a 100644 --- a/ToyEngine/ToyEngine.vcxproj.filters +++ b/ToyEngine/ToyEngine.vcxproj.filters @@ -127,62 +127,63 @@ - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - + + Shaders - + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + Shaders diff --git a/ToyEngine/src/MainWindow.cpp b/ToyEngine/src/MainWindow.cpp index 38f8a82..3a61913 100644 --- a/ToyEngine/src/MainWindow.cpp +++ b/ToyEngine/src/MainWindow.cpp @@ -73,9 +73,6 @@ int MainWindow::exec(std::unique_ptr world_) void MainWindow::processInput(GLFWwindow* window, float deltaTime) { - if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) - glfwSetWindowShouldClose(window, true); - world->processInput(window, deltaTime); } @@ -96,6 +93,8 @@ void MainWindow::scrollCallback(GLFWwindow* window, double xoffset, double yoffs void MainWindow::keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) { + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) + glfwSetWindowShouldClose(window, true); if (key == GLFW_KEY_TAB && action == GLFW_PRESS) RenderingSystem::instance().setShowDebug(!RenderingSystem::instance().getShowDebug()); world->keyCallback(window, key, scancode, action, mods); diff --git a/ToyEngine/src/Mesh.h b/ToyEngine/src/Mesh.h index 14c9950..a3f8027 100644 --- a/ToyEngine/src/Mesh.h +++ b/ToyEngine/src/Mesh.h @@ -32,12 +32,12 @@ public: GLuint textureNormal = 0; glm::vec3 baseColor; glm::vec2 metallicRoughness; - unsigned int VAO; Mesh(GladGLContext* gl, const std::vector& vertices, const std::vector& indices, const glm::mat4& model = glm::mat4(1)); void draw(Shader& shader); void setupMesh(); private: GladGLContext* gl; + unsigned int VAO; unsigned int VBO, EBO; }; \ No newline at end of file diff --git a/ToyEngine/src/Model.cpp b/ToyEngine/src/Model.cpp index 75d7642..3d0f372 100644 --- a/ToyEngine/src/Model.cpp +++ b/ToyEngine/src/Model.cpp @@ -60,7 +60,7 @@ Model Model::createSphere(GladGLContext* gl, const glm::vec3& baseColor, const g mesh->drawMode = GL_TRIANGLE_STRIP; mesh->baseColor = baseColor; mesh->metallicRoughness = metallicRoughness; - sphere.meshes.emplace_back(std::move(mesh)); + sphere.meshes.emplace_back(std::make_pair(std::move(mesh), glm::mat4(1))); return sphere; } @@ -79,17 +79,13 @@ Model::Model(GladGLContext* gl, std::string const& path) void Model::draw(Shader& shader) { for (unsigned int i = 0; i < meshes.size(); i++) - meshes[i]->draw(shader); + meshes[i].first->draw(shader); } void Model::setTransform(const glm::mat4& trans) { - auto inverse = glm::inverse(transform); - transform = trans; for (auto& mesh : meshes) - mesh->model = transform * inverse * mesh->model; - minPos = transform * inverse * glm::vec4(minPos, 1); - maxPos = transform * inverse * glm::vec4(maxPos, 1); + mesh.first->model = trans * mesh.second; } std::pair Model::getAABB() @@ -110,23 +106,20 @@ void Model::loadModel(std::string const& path) return; } - aiMatrix4x4 transform; - //aiMatrix4x4::Scaling(aiVector3D(10), transform); - //aiMatrix4x4::Rotation(glm::radians(-90.f), { 1,0,0 }, transform); - processNode(scene->mRootNode, scene, transform * scene->mRootNode->mTransformation); + processNode(scene->mRootNode, scene, scene->mRootNode->mTransformation); } void Model::processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4) { for (unsigned int i = 0; i < node->mNumMeshes; i++) - if (auto mesh = processMesh(scene->mMeshes[node->mMeshes[i]], scene, mat4)) + if (auto mesh = processMesh(scene->mMeshes[node->mMeshes[i]], scene, mat4); mesh.first) meshes.emplace_back(std::move(mesh)); for (unsigned int i = 0; i < node->mNumChildren; i++) processNode(node->mChildren[i], scene, mat4 * node->mChildren[i]->mTransformation); } -std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model) +std::pair, glm::mat4> Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model) { glm::mat4 mat4 = glm::transpose(glm::make_mat4((float*)&model)); @@ -148,7 +141,7 @@ std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, aiM indices.insert(indices.end(), face->mIndices, face->mIndices + face->mNumIndices); if (vertices.empty() || indices.empty()) - return nullptr; + return { nullptr, mat4 }; extractBoneWeightForVertices(vertices, mesh, scene); auto meshPtr = std::make_unique(gl, vertices, indices, mat4); @@ -177,8 +170,7 @@ std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, aiM { } - return meshPtr; - + return std::make_pair(std::move(meshPtr), mat4); } diff --git a/ToyEngine/src/Model.h b/ToyEngine/src/Model.h index 65d99be..551ab3a 100644 --- a/ToyEngine/src/Model.h +++ b/ToyEngine/src/Model.h @@ -21,7 +21,7 @@ class Model { public: glm::mat4 transform = glm::mat4(1); - std::vector> meshes; + std::vector, glm::mat4>> meshes; std::map boneInfoMap; int boneCount = 0; @@ -40,7 +40,7 @@ private: void loadModel(std::string const& path); void processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4 = aiMatrix4x4()); - std::unique_ptr processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model); + std::pair, glm::mat4> processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model); GLuint loadMaterialTextures(aiMaterial* mat, aiTextureType type); void extractBoneWeightForVertices(std::vector& vertices, aiMesh* mesh, const aiScene* scene); }; \ No newline at end of file diff --git a/ToyEngine/src/Particle.cpp b/ToyEngine/src/Particle.cpp index 695f5c6..6aea6f5 100644 --- a/ToyEngine/src/Particle.cpp +++ b/ToyEngine/src/Particle.cpp @@ -19,6 +19,7 @@ Particle::Particle(float mass, const std::string& path) void Particle::logicalTick(float deltaTime) { + Actor::logicalTick(deltaTime); resultantForce = glm::vec3(0); for (std::lock_guard lk(forcesMutex); auto & force : forces) resultantForce += force->value; @@ -29,8 +30,8 @@ void Particle::logicalTick(float deltaTime) } else { - //auto pos = getPosition() + speed * deltaTime + 0.5f * resultantForce / mass * deltaTime * deltaTime; - speed += resultantForce / mass * deltaTime; + acceleration = resultantForce / mass; + speed += acceleration * deltaTime; auto pos = getPosition() + speed * deltaTime; setPosition(pos); } @@ -45,12 +46,10 @@ void Particle::draw(const RenderPassContext& context, Shader& shader) static unsigned int vbo; if (vao == 0) { - float vertices[] = { - // positions + float vertices[] = { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, }; - // setup plane VAO gl->GenVertexArrays(1, &vao); gl->GenBuffers(1, &vbo); gl->BindVertexArray(vao); @@ -64,7 +63,7 @@ void Particle::draw(const RenderPassContext& context, Shader& shader) gl->DepthMask(false); debugShader.setUniformValue("projection", *context.projection); debugShader.setUniformValue("view", *context.view); - glm::mat4 modelMatrix = glm::translate(glm::mat4(1), getPosition());// *glm::scale(glm::mat4(1), glm::vec3(glm::abs(resultantForce / mass))); + glm::mat4 modelMatrix = glm::translate(glm::mat4(1), getPosition()); gl->BindVertexArray(vao); for (std::lock_guard lk(forcesMutex); auto & force : forces) {