canvas写的立方体动画

<html>
<head>
 <meta charset="gbk" />
 <title>3D cube HTML5 canvas realization</title>
 <script type="text/javascript">
function color(r, g, b, a) 
{
    this.r = r;
    this.g = g;
    this.b = b;
    this.a = a;
}
function point2D(x, y) 
{
    this.x = x;
    this.y = y;
}
point2D.prototype.move = function(p2D) 
{
    this.x += p2D.x;
    this.y += p2D.y;
}
function point3D(x, y, z) 
{
    this.x = x;
    this.y = y;
    this.z = z;
}
point3D.prototype.move = function(p3D) 
{
    this.x += p3D.x;
    this.y += p3D.y;
    this.z += p3D.z;
}
point3D.prototype.swap = function(p3D) 
{
    this.x = p3D.x;
    this.y = p3D.y;
    this.z = p3D.z;
}
point3D.prototype.rotate = function(axis, angleGr) 
{
    angleRad = angleGr * Math.PI / 180;
    switch (axis) 
    {
    case "x":
        {
            var tempPoint = new point3D(
            this.x,
            this.y * Math.cos(angleRad) - this.z * Math.sin(angleRad),
            this.y * Math.sin(angleRad) + this.z * Math.cos(angleRad)
            );
            this.swap(tempPoint);
            break;
        }
    case "y":
        {
            var tempPoint = new point3D(
            this.x * Math.cos(angleRad) + this.z * Math.sin(angleRad),
            this.y,
            -this.x * Math.sin(angleRad) + this.z * Math.cos(angleRad)
            );
            this.swap(tempPoint);
            break;
        }
    case "z":
        {
            var tempPoint = new point3D(
            this.x * Math.cos(angleRad) - this.y * Math.sin(angleRad),
            this.x * Math.sin(angleRad) + this.y * Math.cos(angleRad),
            this.z
            );
            this.swap(tempPoint);
            break;
        }
    }
}
function normal3D(p3D, length) 
{
    this.point = p3D;
    this.length = length;
}
function poly() 
{
    var points = [];
    for (var i = 0; i < arguments.length; i++)
        points.push(arguments[i]);
    this.points = points;
    // Calculating normal
    var v1 = new point3D(points[2].x - points[1].x,points[2].y - points[1].y,points[2].z - points[1].z);
    var v2 = new point3D(points[0].x - points[1].x,points[0].y - points[1].y,points[0].z - points[1].z);
    var normalP3D = new point3D(v1.y * v2.z - v2.y * v1.z,v1.z * v2.x - v2.z * v1.x,v1.x * v2.y - v2.x * v1.y);
    var normalLen = Math.sqrt(normalP3D.x * normalP3D.x + normalP3D.y * normalP3D.y + normalP3D.z * normalP3D.z);
    this.normal = new normal3D(normalP3D,normalLen);
}
poly.prototype.move = function(p3D) 
{
    for (var i = 0; i < this.points.length; i++) 
    {
        var point = this.points[i];
        point.move(p3D);
    }
}
poly.prototype.rotate = function(axis, angle) 
{
    for (var i = 0; i < this.points.length; i++) 
    {
        var point = this.points[i];
        point.rotate(axis, angle);
    }
    
    this.normal.point.rotate(axis, angle);
}
poly.prototype.put = function(center, fillColor, edgeColor) 
{
    // Calulate visibility
    var normalAngleRad = Math.acos(this.normal.point.z / this.normal.length);
    if (normalAngleRad / Math.PI * 180 >= 90)
        return;
    var lightIntensity = 1 - 2 * (normalAngleRad / Math.PI);
    ctx.fillStyle = 'rgba(' + fillColor.r + ',' + fillColor.g + ',' + fillColor.b + ',' + 
    (fillColor.a * lightIntensity) + ')';
    ctx.beginPath();
    for (var i = 0; i < this.points.length; i++) 
    {
        var point = this.points[i];
        if (i)
            ctx.lineTo(center.x + parseInt(point.x), center.y - parseInt(point.y));
        else
            ctx.moveTo(center.x + parseInt(point.x), center.y - parseInt(point.y));
    }
    ctx.fill();
    ctx.lineWidth = 1;
    ctx.strokeStyle = 'rgba(' + edgeColor.r + ',' + edgeColor.g + ',' + edgeColor.b + ',' + 
    (edgeColor.a * lightIntensity) + ')';
    ctx.beginPath();
    var point = this.points[this.points.length - 1];
    ctx.moveTo(center.x + parseInt(point.x), center.y - parseInt(point.y));
    for (var i = 0; i < this.points.length; i++) 
    {
        var point = this.points[i];
        ctx.lineTo(center.x + parseInt(point.x), center.y - parseInt(point.y));
    }
    ctx.stroke();
}
function Cube(size, fillColor, edgeColor) 
{
    var p000 = new point3D(0,0,0);
    var p0S0 = new point3D(0,size,0);
    var pSS0 = new point3D(size,size,0);
    var pS00 = new point3D(size,0,0);
    var p00S = new point3D(0,0,size);
    var p0SS = new point3D(0,size,size);
    var pSSS = new point3D(size,size,size);
    var pS0S = new point3D(size,0,size);
    var polys = [];
    polys.push(new poly(p000,p0S0,pSS0,pS00));
    polys.push(new poly(pS00,pSS0,pSSS,pS0S));
    polys.push(new poly(pS0S,pSSS,p0SS,p00S));
    polys.push(new poly(p00S,p0SS,p0S0,p000));
    polys.push(new poly(p0S0,p0SS,pSSS,pSS0));
    polys.push(new poly(p00S,p000,pS00,pS0S));
    this.polys = polys;
    var points = [];
    points.push(p000);
    points.push(p0S0);
    points.push(pSS0);
    points.push(pS00);
    points.push(p00S);
    points.push(p0SS);
    points.push(pSSS);
    points.push(pS0S);
    for (var i = 0; i < polys.length; i++) 
    {
        points.push(polys[i].normal.point);
    }
    this.points = points;
    this.fillColor = fillColor;
    this.edgeColor = edgeColor;
}
function move(o3D, p3D) 
{
    for (var i = 0; i < o3D.points.length - o3D.polys.length; i++) 
    {
        var point = o3D.points[i];
        point.move(p3D);
    }
}
function put(o3D, center) 
{
    for (var i = 0; i < o3D.polys.length; i++) 
    {
        var poly = o3D.polys[i];
        poly.put(center, o3D.fillColor, o3D.edgeColor);
    }
}
function rotate(o3D, axis, angle) 
{
    for (var i = 0; i < o3D.points.length; i++) 
    {
        var point = o3D.points[i];
        point.rotate(axis, angle);
    }
}
function init() {
    canvas = document.getElementById('3Dcube');
    if (canvas.getContext) {
        ctx = canvas.getContext('2d');
        ctx.fillStyle = 'rgba(0, 0, 0, 1)';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        // clear canvas
        cube = new Cube(100,new color(50,50,200,1),new color(60,60,210,1));
        move(cube, new point3D(-50,-50,-50));
        rotate(cube, 'x', 45);
        rotate(cube, 'y', 45);
        rotate(cube, 'z', 45);
        
        centerScreen = new point2D(canvas.width / 2,canvas.height / 2);
        put(cube, centerScreen);
        timer = setInterval(nextFrame, 1000 / 60);
    }
}
function nextFrame() 
{
    ctx.fillStyle = 'rgba(0, 0, 0, 1)';
    ctx.fillRect(0, 0, canvas.width, canvas.height);
    // clear canvas
    rotate(cube, 'x', 0.4);
    rotate(cube, 'y', 0.6);
    rotate(cube, 'z', 0.3);
    ctx.fillStyle = 'rgba(50, 50, 200, 1)';
    ctx.strokeStyle = 'rgba(60, 60, 210, 1)';
    put(cube, centerScreen);
}
</script>
</head>
<body οnlοad="init();">

 <canvas id="3Dcube" width="400" height="225"></canvas>
 </body>
 </html>


效果图:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
Canvas3D是HTML5中用于创建3D场景的API之一,它允许您使用JavaScript创建和渲染3D图形。以下是制作Canvas3D动画的一般步骤: 1. 创建HTML元素:在HTML文档中,使用canvas元素创建一个3D画布。 2. 设置画布样式:使用CSS样式设置画布的大小和位置。 3. 创建场景:使用JavaScript创建一个场景对象并将其添加到画布中。 4. 添加3D对象:使用JavaScript创建3D对象并将其添加到场景中。 5. 渲染场景:使用JavaScript在每个动画帧中渲染场景。 6. 添加动画:使用JavaScript创建动画并将其添加到场景中。 以下是一个简单的Canvas3D动画示例,它显示一个旋转的立方体: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Canvas3D Animation Tutorial</title> <style> canvas { width: 500px; height: 500px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); border: 1px solid black; } </style> </head> <body> <canvas id="canvas"></canvas> <script> // 创建画布和场景 var canvas = document.getElementById("canvas"); var context = canvas.getContext("webgl"); var scene = new THREE.Scene(); // 创建相机 var camera = new THREE.PerspectiveCamera(75, canvas.width / canvas.height, 0.1, 1000); camera.position.z = 5; // 创建立方体 var geometry = new THREE.BoxGeometry(1, 1, 1); var material = new THREE.MeshBasicMaterial({color: 0xff0000}); var cube = new THREE.Mesh(geometry, material); scene.add(cube); // 创建动画 var animate = function() { requestAnimationFrame(animate); cube.rotation.x += 0.01; cube.rotation.y += 0.01; context.render(scene, camera); }; animate(); </script> </body> </html> ``` 这个示例使用了Three.js库来简化Canvas3D的编程。您可以通过访问Three.js的官方文档来了解更多关于使用Canvas3D创建3D动画的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值