You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

THREE.js文本上下倒置问题技术求助

问题原因与解决方案

核心原因

文本上下倒置的直接原因是正交相机的视口参数设置错误。WebGL的屏幕坐标系Y轴向下,而Three.js的3D空间默认Y轴向上。你设置top=0、bottom=this.rendererHeight,相当于将相机的上边界对齐屏幕顶部,下边界对齐屏幕底部,这会导致整个场景(包括Troika文本网格)的Y轴方向反转,最终表现为文本上下倒置。

解决方案

修改正交相机的top和bottom参数,将top设为渲染器高度,bottom设为0,即可修正坐标系方向:

public setCameraViewport(near: number = this.__cameraViewportNear, far: number = this.__cameraViewportFar) {
    this.getCamera().left = 0;
    this.getCamera().right = this.rendererWidth;
    this.getCamera().top = this.rendererHeight; // 修正为渲染器高度
    this.getCamera().bottom = 0; // 修正为0
    this.getCamera().near = near; 
    this.getCamera().far = far; 
    this.getCamera().updateProjectionMatrix();
}

补充说明

Troika的TextMesh基于Three.js标准3D坐标系渲染,文本朝向依赖相机投影矩阵方向。当相机视口参数导致坐标系反转时,文本会跟着倒置。调整参数后,相机投影矩阵会正确映射3D空间到屏幕空间,文本就能正常显示。


问题背景信息

请注意,我无法提供完整准确的源代码。

问题截图

渲染出的文本出现了上下倒置的情况,请问这是什么原因导致的?

相机类型

THREE.OrthographicCamera

渲染器设置片段

constructor() {
    this.renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true,
        depth: false
    });

    this.renderer.setPixelRatio(window.devicePixelRatio);
    this.renderer.autoClear = false;
    this.renderer.autoClearColor = true;
    this.renderer.autoClearStencil = true;
    this.renderer.autoClearDepth = true;
}

相机视口设置片段

__cameraViewportNear 值为0.1
__cameraViewportFar 值为100

public setCameraViewport(near: number = this.__cameraViewportNear, far: number = this.__cameraViewportFar) {
    this.getCamera().left = 0;
    this.getCamera().right = this.rendererWidth;
    this.getCamera().top = 0;
    this.getCamera().bottom = this.rendererHeight;
    this.getCamera().near = near; 
    this.getCamera().far = far; 
    this.getCamera().updateProjectionMatrix();
}

网格创建片段

var extrudeSettings = {
    steps: 2,
    depth: 2,
    bevelEnabled: false,
};

//xxx2
let xxx_shape = self.draws().createShape();
xxx_shape.moveTo( 34, 16.8421);
xxx_shape.bezierCurveTo( 34, 29.4737, 17, 40, 17, 40 );
xxx_shape.bezierCurveTo( 17, 40, 0, 29.4737, 0, 16.8421 );
xxx_shape.bezierCurveTo( 0, 7.54047, 7.61116, 0, 17, 0 );
xxx_shape.bezierCurveTo( 26.3888, 0, 34, 7.54047, 34, 16.8421);
xxx_shape.closePath();

//xxx3
let xxx_geo = self.draws().createExtrudeGeometry(xxx_shape, extrudeSettings); // 等价于 new THREE.ExtrudeGeometry
let xxx_material = self.draws().createMeshBaiscMeterial({color:0x4fff82}); // 等价于 new THREE.MeshBasicMaterial
let xxx_mesh = self.draws().createMesh(xxx_geo, xxx_material); // 等价于 new THREE.Mesh


//xxx4
const xxx_text = self.draws().createTextMesh(); // 使用Troika文本库
xxx_text.text = "HeLp1_23";
xxx_text.fontSize = 24;
xxx_text.position.z = 1;
xxx_text.color = 0xff0000;
xxx_mesh.add(xxx_text);

//xxx5
setTimeout(()=>{
    xxx_text.sync(()=>{
        self.events().emit("@render");
    });
}, 0);

内容的提问来源于stack exchange,提问作者lIIlIllIIlllIIlI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:37:43