three.js绘制二维文本失真

发布于 2022-09-11 20:25:00 字数 843 浏览 22 评论 0

clipboard.png图一
clipboard.png图二

var canvas = document.createElement("canvas")
var ctx = canvas.getContext("2d")
ctx.font = "Normal 30px Arial"
ctx.lineWidth = 1
ctx.fillStyle = "#00FF00"
ctx.textAlign = "center"
ctx.textBaseline = "middle"
ctx.fillText('绘制图形文字', 110, 100)

var texture = new THREE.Texture(canvas)
texture.needsUpdate = true
var material = new THREE.SpriteMaterial({ 
    map: texture,
    // useScreenCoordinates: false,
    transparent: true,
    // rotation: 50
})

var textObject = new THREE.Object3D()
var sprite = new THREE.Sprite(material)
sprite.scale.set(15, 15, 0)
sprite.position.set(-7, 13, 0)

上面代码是我做图一写的,希望能达到图二的效果,但是不知道怎么修改了,请大佬指教!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冬天旳寂寞 2022-09-18 20:25:00

刚碰到这个问题,顺便注册解答下。

首先明确一点,canvas是一张图片,不像svg是矢量图,失真是因为canvas的分辨率低,比如你的canvas长宽都是100px,你把一张100X100的图片放大到整个屏幕这么大,肯定会失真的。

解决方案就是把canvas宽和高都设置到足够大,字体也随之放大,这样放大之后就不会失真了。

function getCanvasMesh(text, width, height, size, color) {
    const canvas = document.createElement('canvas');
    canvas.width = width * 1000;
    canvas.height = height * 1000;
    const context = canvas.getContext('2d');

    context.font = '500px \'微软雅黑\'';

    // const textWidth = context.measureText(text).width;

    context.fillStyle = '#00bffd';
    context.textAlign = 'center';
    context.textBaseline = 'middle';
    context.fillText(text, canvas.width / 2, canvas.height / 2);

    const texture = new THREE.CanvasTexture(canvas);
    texture.needsUpdate = true;

    const material = new THREE.MeshBasicMaterial({
        map: texture,
        side: THREE.DoubleSide
    });

    const mesh = new THREE.Mesh(new THREE.PlaneGeometry(width, height), material);

    return mesh;
}

下面图片是放大后的效果
放大后的效果

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文