【问题标题】:3d drawing in Canvas with HTML+JS使用 HTML+JS 在 Canvas 中进行 3d 绘图
【发布时间】:2010-10-22 04:19:28
【问题描述】:

是否有任何框架/引擎可以在 Canvas 上绘制 3d 图像?

我打算在一个平面上绘制一些图元(不同的形状):

    var dist = 2;
    var hexHalfW = 35;
    var lengthX = 20;
    var hexR = Math.sqrt(lengthX*lengthX+hexHalfW*hexHalfW);//40.31128874
    var hexDiag = 2*hexR;
    var hexHeight = hexDiag;
    var hexWidth = 2*hexHalfW;

    function DrawHex(ctx, x, y)
    {               
        var cx = x*(hexWidth + dist) - y*(hexWidth + dist)/2;
        var cy = y*(hexR + lengthX + dist);
        ctx.beginPath();
        ctx.moveTo(cx, cy-hexR);
        ctx.lineTo(cx+hexHalfW, cy-hexR+lengthX);
        ctx.lineTo(cx+hexHalfW, cy+hexR-lengthX);
        ctx.lineTo(cx, cy+hexR);
        ctx.lineTo(cx-hexHalfW, cy+hexR-lengthX);
        ctx.lineTo(cx-hexHalfW, cy-hexR+lengthX);
        ctx.lineTo(cx, cy-hexR);
        ctx.fill();
    }

    function draw()
    {
        var canvas = document.getElementById('tutorial');
        if (canvas.getContext)
        {
            var ctx = canvas.getContext('2d');

            //Pick Hexagon color, this one will be blue
            ctx.fillStyle = "rgb(0, 0, 255)";   DrawHex(ctx, 1, 1);
            ctx.fillStyle = "rgb(0, 0, 225)";   DrawHex(ctx, 3, 1);
            ctx.fillStyle = "rgb(0, 0, 195)";   DrawHex(ctx, 4, 1);
            ctx.fillStyle = "rgb(0, 0, 165)";   DrawHex(ctx, 6, 1);

            ctx.fillStyle = "rgb(0, 255, 0)";   DrawHex(ctx, 3, 2);
            ctx.fillStyle = "rgb(0, 225, 0)";   DrawHex(ctx, 4, 2);
            ctx.fillStyle = "rgb(0, 195, 0)";   DrawHex(ctx, 5, 2);
        }
    }

我想在“透视”中绘制这些图元:更近的形状(在屏幕底部)会更大,“远处”的形状(在屏幕顶部)需要更小......

为此,需要重新计算形状坐标。

猜猜,我可以找到一些允许重新计算坐标并编写适当函数的公式......但是,可能有一些引擎已经这样做了?

请指教。

欢迎提出任何想法!

【问题讨论】:

    标签: javascript html 3d canvas drawing


    【解决方案1】:

    无论您选择什么框架,您都应该学习将数据封装到对象中。

    -View simple demo-

    六边形

    // Hexagon
    function Hexagon(ctx, color, pos, size, scale) {
        this.color = color;
        this.ctx = ctx;
        this.x = pos[0];
        this.y = pos[1];
        this.z = pos[2] || 0; // scale
        this.width = size.width;
        this.height = size.height;
    }
    

    Hexagon.draw

    // Hexagon.draw
    Hexagon.prototype.draw = function (x, y) {
        if (x == null || y == null) {
            x = this.x;
            y = this.y; 
        }
        var width  = this.width  + (this.width  * this.z), // scaled width
            height = this.height + (this.height * this.z), // scaled height
            cx  = x * (width + dist) - y * (width + dist) / 2,
            cy  = y * (3/4 * height + dist),
            ctx = this.ctx;
        ctx.fillStyle = this.color;
        ctx.beginPath();
        ctx.moveTo(cx, cy - height/2);
        ctx.lineTo(cx + width/2, cy - height/4);
        ctx.lineTo(cx + width/2, cy + height/4);
        ctx.lineTo(cx, cy + height/2);
        ctx.lineTo(cx - width/2, cy + height/4);
        ctx.lineTo(cx - width/2, cy - height/4);
        ctx.lineTo(cx, cy - height/2);  
        ctx.fill();
    };
    

    用法

    var canvas = document.getElementById('tutorial');
    var ctx = canvas.getContext('2d');
    var dist = 2;
    
    // Create Hexagons
    var size = { 
       width:  70, 
       height: 80 
    };
    
    var hexes = [
        new Hexagon(ctx, "rgb(0, 0, 255)", [1, 1], size),
        new Hexagon(ctx, "rgb(0, 0, 225)", [3, 1], size),
        new Hexagon(ctx, "rgb(0, 0, 195)", [4, 1], size),
        new Hexagon(ctx, "rgb(0, 0, 165)", [6, 1], size),
        new Hexagon(ctx, "rgb(0, 225, 0)", [3, 2], size),
        new Hexagon(ctx, "rgb(0, 225, 0)", [4, 2], size),
        new Hexagon(ctx, "rgb(0, 195, 0)", [5, 2], size)
    ];
    
    function draw() {
        for (var i = hexes.length; i--;) {
            hexes[i].draw();
        }
    }
    

    【讨论】:

    • galambalazs:您的建议与问题无关。但你是 100% 正确的!不要把我的代码放在心上……那只是一个原型……老实说,我只是在学习如何在 JS 中使用对象/类。但我肯定会使用 'Hex' 类:)
    【解决方案2】:

    你可能想看看 mrdoob 的 three.js:

    http://github.com/mrdoob/three.js/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多