Minecraft 3D文本渲染位置错误问题求助
Minecraft 3D文本渲染位置错误问题求助
看起来你的问题主要出在矩阵变换顺序错误、Z轴缩放异常和文本锚点未对齐这几个核心点上,我帮你一步步分析并修正代码:
问题原因拆解
- 矩阵变换顺序完全颠倒:矩阵变换是右结合的,你原代码里先旋转再平移的逻辑,会导致目标位置被错误旋转,直接让文本跑位到奇怪的地方。
- Z轴缩放设为0:把Z轴缩放压到0会直接破坏3D空间的深度信息,文本的渲染深度会异常,自然位置不对。
- 文本锚点未居中:默认
textRenderer.draw的(0,0)是文本的左上角,直接渲染会让文本从目标点的左上角开始,而非你预期的中心位置。
修正后的完整代码
1. 修复calculateModelViewMatrix函数
public static void calculateModelViewMatrix(MatrixStack matrixStack, Vec3d worldPos, Camera camera) { // 1. 先把世界坐标转换到相机空间(抵消相机自身位置) matrixStack.translate( (float) -camera.getPos().x, (float) -camera.getPos().y, (float) -camera.getPos().z ); // 2. 平移到目标世界位置 matrixStack.translate( (float) worldPos.x, (float) worldPos.y, (float) worldPos.z ); // 3. 应用相机逆旋转,让文本始终面向玩家(Billboard效果) Quaternionf inverseRotation = camera.getRotation().copy(); inverseRotation.conjugate(); matrixStack.multiply(inverseRotation); }
2. 修复renderText函数
public void renderText(Vec3d pos) { var client = MinecraftClient.getInstance(); if (client == null) return; var textRenderer = client.textRenderer; if (buffer == null) return; MatrixStack matrixStack = this.matrixStack; matrixStack.push(); calculateModelViewMatrix(matrixStack, pos, client.gameRenderer.getCamera()); // 修正缩放:Z轴保持与XY一致的比例,负号用于翻转文本朝向(匹配相机视角) float textScale = 0.025f; matrixStack.scale(-textScale, -textScale, textScale); // 准备文本并计算居中偏移量 Text displayText = Text.literal("123"); int textWidth = textRenderer.getWidth(displayText); int textHeight = textRenderer.fontHeight; // 偏移坐标让文本中心精准对齐目标点 float centerOffsetX = -textWidth / 2f; float centerOffsetY = -textHeight / 2f; // 渲染文本,使用标准光照常量确保可见性 textRenderer.draw( displayText, centerOffsetX, centerOffsetY, 0xFFFFFFFF, true, matrixStack.peek().getPositionMatrix(), client.getBufferBuilders().getEntityVertexConsumers(), TextRenderer.TextLayerType.NORMAL, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE ); matrixStack.pop(); }
关键调整说明
- 矩阵顺序修正:先完成相机空间的平移,再定位到世界目标点,最后应用旋转,确保文本位置精准且始终面向相机。
- Z轴缩放修复:将Z轴缩放设为与XY一致的
textScale,维持3D空间深度,避免渲染时的位置偏移或裁剪问题。 - 文本居中对齐:通过计算文本宽高,偏移坐标让文本中心完全匹配你设置的
(0,0,0)参考点,和你添加的标记点完全重合。 - 光照参数优化:使用
LightmapTextureManager.MAX_LIGHT_COORDINATE确保文本在任何场景下都清晰可见,不会因光照过暗被忽略。
现在你再测试渲染(0,0,0)位置的文本,应该会和你预期的参考点完全重合,且相机移动时文本会正确保持在目标位置并始终面向你。




