【问题标题】:How to add text into along the object using three.js如何使用three.js沿对象添加文本
【发布时间】:2016-10-30 15:59:09
【问题描述】:

我已使用文本几何将文本添加到我的对象(衬衫模型)中。这是我的代码:

var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
ctx.font = 'italic 18px Arial';
ctx.textAlign = 'center';
ctx. textBaseline = 'middle';
ctx.fillStyle = 'red'; 
ctx.fillText('Your Text', 150, 50);`

我的输出如下所示:

文字不适合衬衫款式。如果我旋转衬衫模型意味着文本显示不相关的视图。我想像这样将文本放入衬衫模型中:

如何使用 three.js 将我的动态文本放入衬衫模型中。

【问题讨论】:

  • 我也用过 BendModifier。我找不到适合衬衫型号的解决方案
  • 您可以使用文本创建纹理(手动或将 2d 画布渲染到纹理)或创建类似于文本 threejs.org/examples/#webgl_geometry_text 的模型,如果您愿意,webGL 中不支持文本要继续使用 2D 画布渲染器,您可以使用 ctx.transform 转换文本部分,以某种方式模拟想要的变形...
  • threejs.org/examples/webgl_decals.html。将 spt 纹理更改为您的文本(使用 2d 画布,在其中放置一些文本,将其用作纹理的来源)

标签: javascript canvas three.js


【解决方案1】:

仅将文本绘制到 2D 画布上很可能永远不会给您带来满意的结果。你有三种可能来解决这个问题。

  1. 使用带有THREE.TextureLoadertextures
  1. 使用THREE.TextGeometry:
  1. 使用 CSS3D 解决方案。

还可以查看THREE.TextGeometry 文档页面上的 UI 示例:

【讨论】:

  • 感谢您的回复。有没有在衬衫模型中使用文本编辑器的选项?文本编辑器,如移动、拖动和克隆删除选项
  • @Thirupaa 我想这一切都应该是可能的,但这可能意味着很多自定义代码。对于three.js 来说,没有任何开箱即用的东西。但是看看the THREE.TextGeometry page,你会看到一个带有一些选项的用户界面。也许您可以以此为起点...
  • 为了获得良好的效果,我建议将文本渲染为纹理,然后使用贴花将其投影到您的模型上(查看 THREE.DecalGeometry)。
  • @Thirupaa 我同意 mlkn 的观点,即纹理很可能会给你带来最好的结果。检查here for reference of THREE.DecalGeometry
  • 谢谢威尔特和 mlkn。 THREE.DecalGeometry 对我来说很好。
【解决方案2】:

如果您正在搜索“如何在 3D 对象中放置 3D 文本”,我将解释如何做到这一点,让我们从理论开始,

想象一下,如果您的相机从 y 轴(三个 js 轴)观看,那么您将添加一个与函数 sin(2*pi) 完全匹配的文本对吧?

所以,

正如你所看到的,这个想法是试图获得 sin(x) 函数的一些切线,其秘诀在于将文本切割成适合你的文本的切线数量...

对于文本“Montiel Software”,现在将是 ["Mon","tiel","Soft","Ware"]

标志:

function flag(u,v,vector)
{
var x = 10*u;
var y = 10*v;
var z = Math.sin(2*Math.PI*u) ;
vector.set(x,y,z);}

创建几何体:

var geometry_sin = new THREE.ParametricGeometry(flag, 100, 100);
var material_sin = new THREE.MeshPhongMaterial({map:groundTexture,side:THREE.DoubleSide, color:0x000000} );
var flag = new THREE.Mesh( geometry_sin, material_sin );

现在将文本添加到标志(在此处选择切线),然后将标志添加到场景:

var loader = new THREE.FontLoader();
loader.load('js/examples/fonts/helvetiker_regular.typeface.json',function(font){
var geometry = new THREE.TextGeometry( 'Mon', {
        font: font,
        size: 1,
        height: 0.5,
        curveSegments: 12,
        bevelEnabled: false,
        bevelThickness: 0.1,
        bevelSize: 0.1,
        bevelSegments: 0.1
    } );
    var txt_mat = new THREE.MeshPhongMaterial({color:0xffffff});
    var txt_mesh = new THREE.Mesh(geometry, txt_mat);
    txt_mesh.position.z = 0.2;
    txt_mesh.position.y = 5;
    txt_mesh.rotation.y = -Math.PI/8;
    flag.add(txt_mesh);
    var geometry = new THREE.TextGeometry( 'tiel', {
        font: font,
        size: 1,
        height: 0.5,
        curveSegments: 12,
        bevelEnabled: false,
        bevelThickness: 0.1,
        bevelSize: 0.1,
        bevelSegments: 0.1
    } );
    var txt_mat = new THREE.MeshPhongMaterial({color:0xffffff});
    var txt_mesh = new THREE.Mesh(geometry, txt_mat);
    txt_mesh.position.z = 1.2;
    txt_mesh.position.x = 2.5;
    txt_mesh.position.y = 5;
    txt_mesh.rotation.y = Math.PI/12;
    flag.add(txt_mesh);
    var geometry = new THREE.TextGeometry( '$oft', {
        font: font,
        size: 1,
        height: 0.5,
        curveSegments: 12,
        bevelEnabled: false,
        bevelThickness: 0.1,
        bevelSize: 0.1,
        bevelSegments: 0.1
    } );
    var txt_mat = new THREE.MeshPhongMaterial({color:0xffffff});
    var txt_mesh = new THREE.Mesh(geometry, txt_mat);
    txt_mesh.position.z = 0.28;
    txt_mesh.position.x = 4.5;
    txt_mesh.position.y = 5;
    txt_mesh.rotation.y = Math.PI/7;
    flag.add(txt_mesh);
    var geometry = new THREE.TextGeometry( 'Ware', {
        font: font,
        size: 1,
        height: 0.5,
        curveSegments: 12,
        bevelEnabled: false,
        bevelThickness: 0.1,
        bevelSize: 0.1,
        bevelSegments: 0.1
    } );
    var txt_mat = new THREE.MeshPhongMaterial({color:0xffffff});
    var txt_mesh = new THREE.Mesh(geometry, txt_mat);
    txt_mesh.position.z = -1;
    txt_mesh.position.x = 7;
    txt_mesh.position.y = 5;
    txt_mesh.rotation.y = -Math.PI/8;
    flag.add(txt_mesh);

} );
scene.add(flag);

这是我能想象在三个 JS 中执行此操作的唯一方法,如果您只是在搜索制作 3D 对象,我建议您安装 3D builder 并尝试那里的选项,然后将对象加载到三个 js。

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 2017-01-16
    • 2018-06-29
    • 2020-02-15
    • 2017-01-01
    • 2015-07-05
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多