如何使用three.js在运行时绘制线段

时间:2014-04-08 15:35:25

标签: javascript three.js

我是Three.js的新手,我正在尝试实现Microsoft Paint中用于绘制线段的技术。我正在尝试获取onMouseDown上一个点的坐标,然后用onMouseMove扩展一行直到onMouseDown。请帮忙!

1 个答案:

答案 0 :(得分:6)

three.js主要用于3D绘图。如果要复制像绘画这样的2D绘图应用程序,那么使用2D画布可能会更容易:canvas.getContext("2d");

我会假设您确实要绘制三个.js。在这种情况下,我将 this example 放在一起。请按照以下步骤操作:

  1. 单击页面上的任意位置并拖动鼠标以绘制线条。该线在z平面上绘制。
  2. 单击“形状”按钮,注意一个形状是如何接近而另一个形状更接近,这是因为一个形状位于z平面上方而另一个位于z平面上方。
  3. 单击“旋转”按钮,这将使相机缩小并围绕轴旋转。请注意,当您通过z平面时,所有绘图都在该平面上。
  4. 看看代码,主要部分是:

    您需要将鼠标单击坐标投影到平面上。这是通过此功能完成的:

    function get3dPointZAxis(event)
    {
        var vector = new THREE.Vector3(
                    ( event.clientX / window.innerWidth ) * 2 - 1,
                    - ( event.clientY / window.innerHeight ) * 2 + 1,
                    0.5 );
        projector.unprojectVector( vector, camera );
        var dir = vector.sub( camera.position ).normalize();
        var distance = - camera.position.z / dir.z;
        var pos = camera.position.clone().add( dir.multiplyScalar( distance ) );    
        return pos;
    }
    

    然后画出前一行到此点:

    geometry.vertices.push(lastPoint);
    geometry.vertices.push(pos);
    var line = new THREE.Line(geometry, material);
    scene.add(line);
    

    请注意,当您在旋转时接近通过z平面时,对Z的投影距离很远并且您越界,以防止以下检查完成:

    if( Math.abs(lastPoint.x - pos.x) < 500 && Math.abs(lastPoint.y - pos.y) < 500 && Math.abs(lastPoint.z - pos.z) < 500 )
    

    作为参考,我找到了投射鼠标坐标here(SO答案)和here(three.js样本)的信息。

    <强>更新

    要从mousedown位置绘制一条线到mouseup位置,请参阅 this demo 。代码更改只是在鼠标向上的点之间进行绘制。

    function stopDraw(event)
    {
         if( lastPoint )
        {
            var pos = get3dPointZAxis(event);
            var material = new THREE.LineBasicMaterial({
                color: 0x0000ff
            });
            var geometry = new THREE.Geometry();
            if( Math.abs(lastPoint.x - pos.x) < 2000 && Math.abs(lastPoint.y - pos.y) < 2000 && Math.abs(lastPoint.z - pos.z) < 2000 )
            {
                geometry.vertices.push(lastPoint);
                geometry.vertices.push(pos);
    
                var line = new THREE.Line(geometry, material);
                scene.add(line);
                lastPoint = pos;        
            }
            else
            {
                console.debug(lastPoint.x.toString() + ':' + lastPoint.y.toString() + ':' + lastPoint.z.toString()  + ':' + 
                            pos.x.toString() + ':' + pos.y.toString()  + ':' + pos.z.toString());
            }
        }
    }