feat(render): 实现模型旋转中心点支持- 为 ModelPart 添加 pivot 属性,支持设置旋转中心点

- 更新局部变换矩阵计算,考虑 pivot 对旋转和平移的影响
- 在 Mesh2D 中增强着色器 uniform 设置,兼容 uModelMatrix 和 uModel- 添加 setPivot 和 getPivot 方法,支持动态调整旋转中心- 创建测试用例 ModelRenderTest2,验证不同 pivot 点的旋转效果
-修复纹理绑定逻辑,确保渲染时正确应用纹理
- 添加调试纹理生成功能,便于视觉验证 pivot 效果
This commit is contained in:
tzdwindows 7
2025-10-08 18:45:17 +08:00
parent becf789cb8
commit 424c00ede9
4 changed files with 317 additions and 24 deletions

View File

@@ -127,7 +127,6 @@ public final class ModelRender {
FragColor = vec4(vDebugPos * 0.5 + 0.5, 0.0, 1.0);
return;
}
vec4 tex = texture(uTexture, vTexCoord);
vec4 finalColor = tex * uColor;
if (uBlendMode == 1) finalColor.rgb = tex.rgb + uColor.rgb;
@@ -347,24 +346,27 @@ public final class ModelRender {
}
private static void renderMesh(Mesh2D mesh, Matrix3f modelMatrix) {
// 使用默认 shader保证 shader 已被 use
if (!mesh.isVisible()) return;
// 使用默认 shader
defaultProgram.use();
// 如果 mesh 已经被烘焙到世界坐标,则传 identity 矩阵给 shader防止重复变换
Matrix3f matToUse = mesh.isBakedToWorld() ? new Matrix3f().identity() : modelMatrix;
// 确保 shader 中的矩阵 uniform 已更新(再次设置以防遗漏)
setUniformMatrix3(defaultProgram, "uModelMatrix", matToUse);
setUniformMatrix3(defaultProgram, "uModel", matToUse);
// 调用 Mesh2D 的 draw 重载(传 program id 与实际矩阵)
try {
mesh.draw(defaultProgram.programId, matToUse);
} catch (AbstractMethodError | NoSuchMethodError e) {
// 回退:仍然兼容旧的无参 draw在这种情况下 shader 的 uModelMatrix 已经被设置)
mesh.draw();
// 设置纹理相关的uniform
if (mesh.getTexture() != null) {
mesh.getTexture().bind(0); // 绑定到纹理单元0
setUniformIntInternal(defaultProgram, "uTexture", 0);
} else {
// 使用默认白色纹理
GL11.glBindTexture(GL11.GL_TEXTURE_2D, defaultTextureId);
setUniformIntInternal(defaultProgram, "uTexture", 0);
}
// 调用 Mesh2D 的 draw 方法,传入当前使用的着色器程序和变换矩阵
mesh.draw(defaultProgram.programId, matToUse);
checkGLError("renderMesh");
}