修复可视化collider功能在旋转的模型中出现偏移bug
This commit is contained in:
@ -155,10 +155,13 @@ namespace Hazel
|
|||||||
|
|
||||||
float hx = bc2d.Size.x * transform.Scale.x;
|
float hx = bc2d.Size.x * transform.Scale.x;
|
||||||
float hy = bc2d.Size.y * transform.Scale.y;
|
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.density = bc2d.Density;
|
||||||
shapedef.material.friction = bc2d.Friction;
|
shapedef.material.friction = bc2d.Friction;
|
||||||
shapedef.material.restitution = bc2d.Restitution;
|
shapedef.material.restitution = bc2d.Restitution;
|
||||||
|
|||||||
@ -152,32 +152,17 @@ namespace Hazel
|
|||||||
{
|
{
|
||||||
auto [tc, bc2D] = bcview.get<TransformComponent, BoxCollider2DComponent>(entity);
|
auto [tc, bc2D] = bcview.get<TransformComponent, BoxCollider2DComponent>(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), tc.Translation)
|
||||||
|
|
||||||
|
|
||||||
// 创建完整的模型变换矩阵
|
|
||||||
glm::mat4 model = glm::translate(glm::mat4(1.0f), translation1)
|
|
||||||
* glm::rotate(glm::mat4(1.0f), tc.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f))
|
* 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::scale(glm::mat4(1.0f), tc.Scale);
|
||||||
|
|
||||||
// 将 offset 从局部空间变换到世界空间
|
|
||||||
glm::vec4 worldOffset = model * glm::vec4(bc2D.Offset.x, bc2D.Offset.y, 0.0f, 1.0f);
|
glm::vec4 worldOffset = model * glm::vec4(bc2D.Offset.x, bc2D.Offset.y, 0.0f, 1.0f);
|
||||||
|
// glm::vec3 translation = glm::vec3(worldOffset) + glm::vec3(0.0f, 0.0f, 0.001f);
|
||||||
// 最终位置 = 实体位置 + 变换后的offset + Z偏移
|
|
||||||
glm::vec3 translation = glm::vec3(worldOffset) + glm::vec3(0.0f, 0.0f, 0.001f);
|
|
||||||
|
|
||||||
// 计算缩放 (Size 是半宽半高,所以要乘2)
|
|
||||||
glm::vec3 scale = tc.Scale * glm::vec3(bc2D.Size * 2.0f, 1.0f);
|
glm::vec3 scale = tc.Scale * glm::vec3(bc2D.Size * 2.0f, 1.0f);
|
||||||
|
|
||||||
// 创建碰撞体变换矩阵 (包含旋转)
|
|
||||||
glm::mat4 transform =
|
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::rotate(glm::mat4(1.0f), tc.Rotation.z, glm::vec3(0.0f, 0.0f, 1.0f))
|
||||||
* glm::scale(glm::mat4(1.0f), scale);
|
* glm::scale(glm::mat4(1.0f), scale);
|
||||||
|
|
||||||
@ -185,30 +170,24 @@ namespace Hazel
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
auto bcview = m_ActiveScene->GetAllEntitiesWith<TransformComponent, BoxCollider2DComponent>();
|
|
||||||
for (auto entity : bcview)
|
|
||||||
{
|
|
||||||
auto [tc, bc2D] = bcview.get<TransformComponent, BoxCollider2DComponent>(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<TransformComponent, CircleCollider2DComponent>();
|
auto ccview = m_ActiveScene->GetAllEntitiesWith<TransformComponent, CircleCollider2DComponent>();
|
||||||
for (auto entity : ccview)
|
for (auto entity : ccview)
|
||||||
{
|
{
|
||||||
auto [tc, cc2D] = ccview.get<TransformComponent, CircleCollider2DComponent>(entity);
|
auto [tc, cc2D] = ccview.get<TransformComponent, CircleCollider2DComponent>(entity);
|
||||||
glm::vec3 translation = tc.Translation + glm::vec3(cc2D.Offset, 0.001f);
|
glm::mat4 model = glm::translate(glm::mat4(1.0f), tc.Translation)
|
||||||
glm::vec3 scale = tc.Scale * glm::vec3(cc2D.Radius * 2.0f);
|
* 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);
|
glm::vec4 worldOffset = model * glm::vec4(cc2D.Offset.x, cc2D.Offset.y, 0.0f, 1.0f);
|
||||||
Renderer2D::DrawCircle(transform, glm::vec4(0.2, 1.0f, 0.2f, 1.0f), Renderer2D::GetLineWidth() * 0.01f);
|
// 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();
|
Renderer2D::EndScene();
|
||||||
|
|||||||
Reference in New Issue
Block a user