【问题标题】:Drawing mode on lower canvas and how to render controls on upper canvas instead of lower下画布上的绘图模式以及如何在上画布而不是下画布上呈现控件
【发布时间】:2020-03-16 05:31:23
【问题描述】:

我开始开发我的项目,其中织物 js 画布用作我的 3d 对象上的纹理,由三个 js 库加载。不幸的是,我现在没有完整的工作 sn-p,也许你可以告诉我解决方案或解决我问题的正确方法

问题是在下部画布上绘制的控件及其在我的 3d 对象上的传输,我想在上部画布上渲染它。可能吗? 第二个问题是画笔首先呈现在上部画布上,然后在事件“鼠标:向上”后呈现在下部画布上。如何通过事件“鼠标”渲染画笔线;绘制时在下部画布上移动'?

附言对不起我的英语,对我来说真的很难说。希望你能理解我的想法

在这里你可以看到我的第一个问题: https://1drv.ms/u/s!AqtIFlFVWz4MhNtBc3g1DQElfA6_7Q?e=y7ly37

感谢您的回复!

【问题讨论】:

    标签: three.js html5-canvas fabricjs


    【解决方案1】:

    哇!这是一个非常好的代码示例!它也很顺利。它更好地显示了问题。

    我在fabric js 演示中找到了第一个问题(类似于three.js 问题)的解决方案:http://fabricjs.com/controls-customization。 我不擅长面料,所以可能有比这更优雅的解决方案。您可以隐藏控件,渲染到 three.js,然后再次显示它们。您还必须强制画布进行渲染,否则将无法正常工作。

    function animate() {
        requestAnimationFrame(animate);
    
        //find the selected object on the fabric canvas
        let selected = canvas.getActiveObject();
    
        //hide controles and render on the fabric canvas;
        if (selected){
            selected.hasControls = false;
            selected.hasBorders = false;
            canvas.renderAll();
        }
    
        //update texture and render
        texture.needsUpdate = true;
        renderer.render(scene, camera);
    
        //show controls and render on the fabric canvas
        if (selected){
            selected.hasControls = true;
            selected.hasBorders = true;
            canvas.renderAll();
        }    
    }
    

    第二个问题有点难以理解。我不确定“下部帆布”是什么,以及它是否是我不理解的织物的一部分。这是我能得到的最接近的。我几乎让它在 three.js 渲染器上工作。如果我理解正确的话......

    你需要有一个变量来知道你是否按下了鼠标。只有当您按下鼠标并移动鼠标时,它才会画一个圆圈。

    要对织物“鼠标:移动”做同样的事情,您至少必须禁用织物画布上的选择框。但我不知道这在织物中是如何工作的。

    var raycaster = new THREE.Raycaster();
    var mouse = new THREE.Vector2();
    var mouseDown = false;///////////////////////////// global boolean
    var onClickPosition = new THREE.Vector2();
    
    
    
    container.addEventListener("mousedown", function(){
        mouseDown = true;
        canvas.selection = false;
        onMouseEvt(); //draw circle
    }, false);
    
    container.addEventListener("mouseup", function(){
        mouseDown = false
        canvas.selection = true;
    }, false);
    
    container.addEventListener("mousemove", function(e){
        if (mouseDown){
        onMouseEvt(); //draw circle
        }
    }, false);
    
    
    ///This code does not work, it goes into selection mode..
    canvas.on('mouse:down', function(){
        mouseDown = true;
        addCircle(); 
    }, false);
    
    canvas.on('mouse:up', function(){
        mouseDown = false;
    }, false);
    
    canvas.on('mouse:move', function(){
        if ( mouseDown ){
            addCircle(); 
        }
    }, false);
    

    【讨论】:

    • 哦,是的,我知道你对织物以外的其他选择持开放态度,也许 p5.js 是有趣的东西?但它不支持这些很棒的控件。但是,如果您的目标是更多的“绘图”然后移动/旋转方块,那可能会更容易。
    • 你好@Ivan!首先,非常感谢您的示例!第一个案例完美运行。第二:Fabric 对象创建两个带有 to 类的画布 - 上画布和下画布。您可以在 dom 元素中看到它。我正在尝试开发在下部画布上绘制的画笔,这就是我得到的:codepen.io/vinar22/pen/VwZpaVd?editors=1111 但是,我认为它的实现并不好
    • 我也看到了这个问题:stackoverflow.com/questions/51370679/… 也许有用,但我不知道如何将它集成到我的代码中
    • 这似乎工作正常.. 它不做你想做的事吗?对不起,我不能帮你解决这个问题,我对面料不够好。也许在fabricjs stackoverflow中尝试另一个帖子,只有第二个问题。我仍然不明白那些上/下画布的功能是什么:p 我可以看到它们,但我不知道为什么有两个.. 我喜欢这个项目,祝你好运:)
    • 谢谢伊万!我将您的帖子标记为答案。也祝你好运!
    【解决方案2】:

    这是一个很难回答的问题,它并不是真正的 three.js 的东西,它更多地与 fabric.js 和绘制到画布有关。对象纹理的three.js部分似乎工作正常。

    如果我理解正确,您有一个要在其上渲染控件的覆盖画布,但它们也被渲染到实际的纹理画布上?如果您实际上是在纹理上渲染控件;不要那样做:p

    应该可以让它按照你想要的方式工作。在https://jsfiddle.net/ 或其他地方发布一个小代码示例会很有帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2018-01-17
    • 2018-12-31
    • 2014-09-23
    相关资源
    最近更新 更多