如何将可编辑的文本和图像添加到threejs

Posted

技术标签:

【中文标题】如何将可编辑的文本和图像添加到threejs【英文标题】:How to add editable text and images to threejs 【发布时间】:2021-10-12 11:11:05 【问题描述】:

所以我正在尝试使用织物 js 将新图像和文本作为 3d 对象的纹理添加到我的 3d 配置器中,我使用此代码作为代码库 https://github.com/devramkumardnagarajan/3d-Tshirt-design 和织物 js 的代码 https://codepen.io/ricardcreagia/pen/EdEGod,这就是我所做的

var texture = new THREE.Texture(document.getElementById("canvas"));

这是我加载 svg 的方式

function set_materials(response) 

    var baseSvg = document.getElementById("svgContainer").querySelector("svg");
    var baseSvgData = (new XMLSerializer()).serializeToString(baseSvg);

    $('#svgPathContainer').empty();
    $('#svgTextContainer').empty();
    $('#svgPathContainer').append(baseSvgData).html();
    $('#svgTextContainer').append(baseSvgData).html();
    var texts = $('#svgPathContainer text');
    for (var i = 0; i < texts.length; i++) 
        $(texts[i]).remove();
    
    var paths = $('#svgTextContainer path');
    for (var i = 0; i < paths.length; i++) 
        $(paths[i]).remove();
    
    var svg = document.getElementById("svgPathContainer").querySelector("svg");
    var svgData = (new XMLSerializer()).serializeToString(svg);
    canvas.width = $(svg).width();
    canvas.height = $(svg).height();
    var ctx = canvas.getContext("2d");
    var img = document.createElement("img");
    var material;
    img.setAttribute("src", "data:image/svg+xml;base64," + window.btoa(unescape(encodeURIComponent(svgData))));

    img.onload = function () 
        ctx.drawImage(img, 0, 0);
        var oImg = document.createElement("img");
        oImg.width = "100px";
        oImg.height = "100px";
        oImg.setAttribute("src", 'assets/' + gender + '/cat' + category + '/texture.png');
        oImg.onload = function () 
            ctx.globalAlpha = 0.4;
            ctx.scale(0.3, 0.3);
            var pattern = ctx.createPattern(oImg, 'repeat');
            ctx.fillStyle = pattern;
            ctx.fillRect(0, 0, canvas.width * 3.33, canvas.height * 3.33);
            ctx.globalAlpha = 1;
            ctx.scale(3.33, 3.33);
            var svgText = document.getElementById("svgTextContainer").querySelector("svg");
            var svgTextData = (new XMLSerializer()).serializeToString(svgText);
            var imgT = document.createElement("img");
            imgT.setAttribute("src", "data:image/svg+xml;base64," + window.btoa(unescape(encodeURIComponent(svgTextData))));
            imgT.onload = function () 
                ctx.drawImage(imgT, 0, 0);
                texture.needsUpdate = true;
                map = texture;
                textureMaterial = new THREE.MeshPhongMaterial( map: map );
                load_materials();
                load_styles();
                response(true);
            
        
    ;

我将texture 映射到textureMaterial,这就是我得到的

它没有正确映射 UV,有人知道如何修复它吗?

【问题讨论】:

【参考方案1】:
img.setAttribute("src", ... )

...必须关注

img.onload = function() ...

...以便资源/事件保持正确的顺序。你不能依赖吊装。也许 undefined 每个 Fabric 都会有一个“中心”,但是该特定代码不存在(?)。

【讨论】:

其实,我正在尝试其他方式,我正在更新帖子 希望你能帮助我 没有什么可以说球形 uv 包裹是“错误的”,因为没有迹象表明什么是“正确的”。除了可疑的 ZONE 层之外,Fabric.js ui 没有天生的口袋、背部、袖子等指示。那么你设想正面和背面吗?在任何情况下,只需使用 Fabric.js 来减少和重新定位徽标并拖动它。从飞行前的角度来看,球形可能是最简单的。向丝网印刷机发送他们无论如何都可以修改的模型。 好的,但是有没有办法让fabricjs画布只包裹到某个区域?或者在这种情况下仅适用于 1 个 ZONE 层? Fabric.js 的用途是合成纹理。 Three.js 的用途是将纹理应用于几何体。由于球形 uv 提供完整的覆盖,这是理想的。除非模型文件包含自定义 uv。或者,尽管是否准确导入了任何包含的 uv,但您是否修改了几何图形?不确定的特定用户流可能需要按钮来执行您的功能。例如,您可以制作一个适合 Fabric.js 纹理到口袋的按钮,但如果他们想要流血怎么办?同样,球形会更容易。如果这是针对商品的,是否存在一个特定的模板?两个?

以上是关于如何将可编辑的文本和图像添加到threejs的主要内容,如果未能解决你的问题,请参考以下文章

将可编辑添加到引导表

如何将可编辑内容保存到 WebArchive webView?

如何将文本和图像添加在一起

如何将可编辑数据传递给组件?

如何将可点击的图像添加到 UIPickerView 行?

如何将可关闭的文本标签添加到 Textarea Kendo | jQuery