You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Minecraft 3D文本渲染位置错误问题求助

Minecraft 3D文本渲染位置错误问题求助

看起来你的问题主要出在矩阵变换顺序错误Z轴缩放异常文本锚点未对齐这几个核心点上,我帮你一步步分析并修正代码:

问题原因拆解

  1. 矩阵变换顺序完全颠倒:矩阵变换是右结合的,你原代码里先旋转再平移的逻辑,会导致目标位置被错误旋转,直接让文本跑位到奇怪的地方。
  2. Z轴缩放设为0:把Z轴缩放压到0会直接破坏3D空间的深度信息,文本的渲染深度会异常,自然位置不对。
  3. 文本锚点未居中:默认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)位置的文本,应该会和你预期的参考点完全重合,且相机移动时文本会正确保持在目标位置并始终面向你。

火山引擎 最新活动