feat(render): 实现模型旋转中心点支持- 为 ModelPart 添加 pivot 属性,支持设置旋转中心点
- 更新局部变换矩阵计算,考虑 pivot 对旋转和平移的影响 - 在 Mesh2D 中增强着色器 uniform 设置,兼容 uModelMatrix 和 uModel- 添加 setPivot 和 getPivot 方法,支持动态调整旋转中心- 创建测试用例 ModelRenderTest2,验证不同 pivot 点的旋转效果 -修复纹理绑定逻辑,确保渲染时正确应用纹理 - 添加调试纹理生成功能,便于视觉验证 pivot 效果
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user