diff --git a/Hazel/src/Hazel/Scene/Scene.cpp b/Hazel/src/Hazel/Scene/Scene.cpp index da1ba10..ece8b7b 100644 --- a/Hazel/src/Hazel/Scene/Scene.cpp +++ b/Hazel/src/Hazel/Scene/Scene.cpp @@ -155,10 +155,13 @@ namespace Hazel float hx = bc2d.Size.x * transform.Scale.x; float hy = bc2d.Size.y * transform.Scale.y; - b2ShapeDef shapedef = b2DefaultShapeDef(); - auto rot = b2Rot(cos(0), sin(0)); - b2Polygon boxShape = b2MakeOffsetBox(hx, hy, b2Vec2(bc2d.Offset.x, bc2d.Offset.y), rot); + float offsetX = bc2d.Offset.x * transform.Scale.x; + float offsetY = bc2d.Offset.y * transform.Scale.y; + auto rot = b2Rot(cos(0), sin(0)); + b2Polygon boxShape = b2MakeOffsetBox(hx, hy, b2Vec2(offsetX, offsetY), rot); + + b2ShapeDef shapedef = b2DefaultShapeDef(); shapedef.density = bc2d.Density; shapedef.material.friction = bc2d.Friction; shapedef.material.restitution = bc2d.Restitution; diff --git a/Sandbox/src/Editor/EditorLayer.cpp b/Sandbox/src/Editor/EditorLayer.cpp index b39b9be..7e78571 100644 --- a/Sandbox/src/Editor/EditorLayer.cpp +++ b/Sandbox/src/Editor/EditorLayer.cpp @@ -152,32 +152,17 @@ namespace Hazel { auto [tc, bc2D] = bcview.get(entity); - glm::vec3 scaledOffset = glm::vec3( - bc2D.Offset.x * tc.Scale.x, - bc2D.Offset.y * tc.Scale.y, - 0.0f - ); - glm::vec3 translation1 = tc.Translation + scaledOffset + glm::vec3(0.0f, 0.0f, 0.001f); - - - // 创建完整的模型变换矩阵 - glm::mat4 model = glm::translate(glm::mat4(1.0f), translation1) + glm::mat4 model = glm::translate(glm::mat4(1.0f), tc.Translation) * glm::rotate(glm::mat4(1.0f), tc.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)) * glm::scale(glm::mat4(1.0f), tc.Scale); - // 将 offset 从局部空间变换到世界空间 glm::vec4 worldOffset = model * glm::vec4(bc2D.Offset.x, bc2D.Offset.y, 0.0f, 1.0f); - - // 最终位置 = 实体位置 + 变换后的offset + Z偏移 - glm::vec3 translation = glm::vec3(worldOffset) + glm::vec3(0.0f, 0.0f, 0.001f); - - // 计算缩放 (Size 是半宽半高,所以要乘2) + // glm::vec3 translation = glm::vec3(worldOffset) + glm::vec3(0.0f, 0.0f, 0.001f); glm::vec3 scale = tc.Scale * glm::vec3(bc2D.Size * 2.0f, 1.0f); - // 创建碰撞体变换矩阵 (包含旋转) glm::mat4 transform = - glm::translate(glm::mat4(1.0f), translation) + glm::translate(glm::mat4(1.0f), glm::vec3(worldOffset)) * glm::rotate(glm::mat4(1.0f), tc.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)) * glm::scale(glm::mat4(1.0f), scale); @@ -185,30 +170,24 @@ namespace Hazel } - /* - auto bcview = m_ActiveScene->GetAllEntitiesWith(); - for (auto entity : bcview) - { - auto [tc, bc2D] = bcview.get(entity); - glm::vec3 translation = tc.Translation + glm::vec3(bc2D.Offset, 0.001f); - glm::vec3 scale = tc.Scale * glm::vec3(bc2D.Size * 2.0f, 1.0f); - - glm::mat4 transform = glm::translate(glm::mat4(1.0f), translation) * glm::rotate( - glm::mat4(1.0f), tc.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)) * glm::scale(glm::mat4(1.0f), scale); - Renderer2D::DrawRect(transform, glm::vec4(0.2, 1.0f, 0.2f, 1.0f)); - } - - */ - // circle collider auto ccview = m_ActiveScene->GetAllEntitiesWith(); for (auto entity : ccview) { auto [tc, cc2D] = ccview.get(entity); - glm::vec3 translation = tc.Translation + glm::vec3(cc2D.Offset, 0.001f); - glm::vec3 scale = tc.Scale * glm::vec3(cc2D.Radius * 2.0f); + glm::mat4 model = glm::translate(glm::mat4(1.0f), tc.Translation) + * glm::rotate(glm::mat4(1.0f), tc.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)) + * glm::scale(glm::mat4(1.0f), tc.Scale); - glm::mat4 transform = glm::translate(glm::mat4(1.0f), translation) * glm::scale(glm::mat4(1.0f), scale); - Renderer2D::DrawCircle(transform, glm::vec4(0.2, 1.0f, 0.2f, 1.0f), Renderer2D::GetLineWidth() * 0.01f); + glm::vec4 worldOffset = model * glm::vec4(cc2D.Offset.x, cc2D.Offset.y, 0.0f, 1.0f); + // glm::vec3 translation = glm::vec3(worldOffset) + glm::vec3(0.0f, 0.0f, 0.001f); + glm::vec3 scale = tc.Scale * glm::vec3(cc2D.Radius * 2.05f); + + glm::mat4 transform = + glm::translate(glm::mat4(1.0f), glm::vec3(worldOffset)) + * glm::rotate(glm::mat4(1.0f), tc.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)) + * glm::scale(glm::mat4(1.0f), scale); + + Renderer2D::DrawCircle(transform, glm::vec4(0.2, 1.0f, 0.2f, 1.0f), Renderer2D::GetLineWidth() * 0.015f); } } Renderer2D::EndScene();