three.js 2D文本精灵标签

sch*_*ger 17 javascript html5 three.js html5-canvas

我是three.js的新手,并且有一些属于2D Text的问题:

我想要的是: 我想要一些标签,例如.x,y和z轴.标签应始终贴在相机上.也许以后他们只应该被展示,如果他们徘徊,但这是另一个话题.

我发现这个教程有什么问题(这是我想要实现的效果| http://stemkoski.github.io/Three.js/Sprite-Text-Labels.html),但这是旧版本的三个.js使用类似的方法var spriteAlignment = THREE.SpriteAlignment.topLeft;.我发现这个解决方法(THREE.SpriteAlignment显示为未定义)但我不清楚如何根据我的需要使用新方法.

我正在寻找的东西 也许你可以帮助我说出我正在寻找的东西,或者想出一个简短的方法.

mco*_*ode 9

Text Sprites很不错,但是如果你使用它的数量超过千万,它会因为GPU而减速.

有一种"更好"的方式,将Sprite创建为Canvas,这里有一个我也用它的函数:

    function makeTextSprite( message, parameters )
    {
        if ( parameters === undefined ) parameters = {};
        var fontface = parameters.hasOwnProperty("fontface") ? parameters["fontface"] : "Arial";
        var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 18;
        var borderThickness = parameters.hasOwnProperty("borderThickness") ? parameters["borderThickness"] : 4;
        var borderColor = parameters.hasOwnProperty("borderColor") ?parameters["borderColor"] : { r:0, g:0, b:0, a:1.0 };
        var backgroundColor = parameters.hasOwnProperty("backgroundColor") ?parameters["backgroundColor"] : { r:255, g:255, b:255, a:1.0 };
        var textColor = parameters.hasOwnProperty("textColor") ?parameters["textColor"] : { r:0, g:0, b:0, a:1.0 };

        var canvas = document.createElement('canvas');
        var context = canvas.getContext('2d');
        context.font = "Bold " + fontsize + "px " + fontface;
        var metrics = context.measureText( message );
        var textWidth = metrics.width;

        context.fillStyle   = "rgba(" + backgroundColor.r + "," + backgroundColor.g + "," + backgroundColor.b + "," + backgroundColor.a + ")";
        context.strokeStyle = "rgba(" + borderColor.r + "," + borderColor.g + "," + borderColor.b + "," + borderColor.a + ")";

        context.lineWidth = borderThickness;
        roundRect(context, borderThickness/2, borderThickness/2, (textWidth + borderThickness) * 1.1, fontsize * 1.4 + borderThickness, 8);

        context.fillStyle = "rgba("+textColor.r+", "+textColor.g+", "+textColor.b+", 1.0)";
        context.fillText( message, borderThickness, fontsize + borderThickness);

        var texture = new THREE.Texture(canvas) 
        texture.needsUpdate = true;

        var spriteMaterial = new THREE.SpriteMaterial( { map: texture, useScreenCoordinates: false } );
        var sprite = new THREE.Sprite( spriteMaterial );
        sprite.scale.set(0.5 * fontsize, 0.25 * fontsize, 0.75 * fontsize);
        return sprite;  
    }
Run Code Online (Sandbox Code Playgroud)

  • 函数roundRect(ctx, x, y, w, h, r) { ctx.beginPath(); ctx.moveTo(x + r, y); ctx.lineTo(x + w - r, y); ctx.quadraticCurveTo(x + w, y, x + w, y + r); ctx.lineTo(x + w, y + h - r); ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h); ctx.lineTo(x + r, y + h); ctx.quadraticCurveTo(x, y + h, x, y + h - r); ctx.lineTo(x, y + r); ctx.quadraticCurveTo(x, y, x + r, y); ctx.closePath(); ctx.fill(); ctx.stroke(); } (3认同)
  • “roundRect”函数从哪里来?您可以包含库或函数代码的链接吗?谢谢! (2认同)
  • 我认为这是李Stemkoski的一个功能,看看他的网站有很多很好的例子. (2认同)
  • 你是如何确定`sprite.scale.set(0.5 * fontsize, 0.25 * fontsize, 0.75 * fontsize);`中的常量的? (2认同)