第十讲:html5中canvas实现正方体的动态旋转
来源:互联网 发布:rhino js 编辑:程序博客网 时间:2024/05/11 18:23
在html5的画布上,画出三维图形,并且实现它动态的围着一条轴进行旋转。
实现步骤:
1、定义一个对象Vector3,用于存储三维的坐标
2、定义一个观察点坐标和显示屏,初始化观察点的显示屏的距离(主要通过他们计算出各个点在二维平面的坐标值)
3、定义八个点(为了方便计算,我将会是画布和坐标进行i平移和旋转)
4、通过一定的公式,计算出八个点显示在平面的坐标(x,y)
5、使用moveTo和lineTo连接所有的直线
6、定义进行旋转的方法(难点,主要使用三维立体计算出各个点的推导公式)
7、最后进行旋转
<html><head><title>3D图形(3D旋转)</title><script src="../js/jscex.jscexRequire.min.js" type="text/javascript"></script><style type="text/css">body{margin: 0 0 0 0;padding: 0 0 0 0;}</style></head><body><canvas id="mc" width="600px" height="600px" style="background-color: #111;"></canvas><script type="text/javascript">//定义一个三维矢量类Vector3 = function(x,y,z){this.x = x;this.y = y;this.z = z;}//////////////////////////////////////////////////var canvas = document.getElementById('mc');var cxt = canvas.getContext('2d');//定义一些常量,用于以后使用var currentAngle = 0;var translateX = 300;var translateY = 300;var points = [];var distance = 500;//定义摄像机和摄像机距离显示屏的距离var eyePosition = new Vector3(0,0,700);//定义眼睛所在的位置cxt.translate(translateX,translateY);cxt.scale(1,-1);//是的y的方向相反//初始化八个顶点function init_eight_points(){//z轴上面的四个点points[0] = new Vector3(100,100,100);points[1] = new Vector3(100,-100,100);points[2] = new Vector3(-100,-100,100);points[3] = new Vector3(-100,100,100);//下面四个点points[4] = new Vector3(100,100,-100);points[5] = new Vector3(100,-100,-100);points[6] = new Vector3(-100,-100,-100);points[7] = new Vector3(-100,100,-100);}//8个顶点、摄像机、摄像机到显示屏的距离都已经有了。就可以开始计算八个顶点到显示屏上面的x、y坐标了//projection 投射、发射、推测function chang_projection(){for(var i = 0 ;i < points.length ; i++){points[i].x = points[i].x * distance / Math.abs(eyePosition.z - points[i].z);points[i].y = points[i].y * distance / Math.abs(eyePosition.z - points[i].z);}}//已经计算出来了所有点的坐标,接下来就是把所有的点的坐标连接起来就行function drawCube(){//画出下面的八条虚线cxt.strokeStyle = "#0FF595";cxt.lineWidth = 2;cxt.beginPath();cxt.moveTo(points[4].x,points[4].y);cxt.lineTo(points[5].x,points[5].y);cxt.lineTo(points[6].x,points[6].y);cxt.lineTo(points[7].x,points[7].y);cxt.lineTo(points[4].x,points[4].y);cxt.lineTo(points[0].x,points[0].y);cxt.moveTo(points[5].x,points[5].y);cxt.lineTo(points[1].x,points[1].y);cxt.moveTo(points[6].x,points[6].y);cxt.lineTo(points[2].x,points[2].y);cxt.moveTo(points[7].x,points[7].y);cxt.lineTo(points[3].x,points[3].y);cxt.moveTo(points[0].x,points[0].y);cxt.lineTo(points[1].x,points[1].y);cxt.lineTo(points[2].x,points[2].y);cxt.lineTo(points[3].x,points[3].y);cxt.lineTo(points[0].x,points[0].y);cxt.stroke();}//旋转计算坐标的方法 (沿着x轴旋转)function rotate(angle){//沿着x轴进行旋转for (i = 0; i < points.length; i++) {var tempY = points[i].y;points[i].y = points[i].y * Math.cos(angle) - points[i].z * Math.sin(angle);points[i].z = tempY * Math.sin(angle) + points[i].z * Math.cos(angle);}//沿着y轴进行旋转for (var i = 0; i < points.length; i++) { var tempX = points[i].x; points[i].x = points[i].x * Math.cos(angle) - points[i].z * Math.sin(angle); points[i].z = points[i].z * Math.cos(angle) + tempX * Math.sin(angle); } //沿着z轴进行旋转 for(var i = 0 ; i < points.length ; i++){ var tempX = points[i].x; var tempY = points[i].y; points[i].x = tempX * Math.cos(angle) - tempY * Math.sin(angle); points[i].y = tempX * Math.sin(angle) + tempY * Math.cos(angle); }}//计算角度的方法function degToRad(a){return a * Math.PI / 180;}//移动显示屏改变其三维投影的图形var somethingAsync = eval(Jscex.compile("async", function () {while (true) {cxt.clearRect(-translateX,-translateY,canvas.width,canvas.height);//清除画布init_eight_points();//初始化所有的点rotate(degToRad(currentAngle));//旋转角度之后,计算所有的点坐标currentAngle += 10;//每次以10°的频率旋转chang_projection();//计算所有点在二维平面的上的坐标drawCube();//画出所有的图形$await(Jscex.Async.sleep(100));}}));somethingAsync().start();</script><br></body></html>
0 0
- 第十讲:html5中canvas实现正方体的动态旋转
- HTML5+Canvas 正方体旋转
- html5<canvas模拟三维图形>(旋转的正方体)
- 第六讲:html5中canvas实现疯狂的大炮轰击
- CSS3的transform属性实现旋转正方体
- 能旋转的正方体
- 旋转的正方体
- OpenGL 旋转的正方体
- html5的canvas旋转动画
- HTML5 Canvas 旋转的“金字塔”
- HTML5 Canvas 旋转的“金字塔”
- H5 实现一个正方体旋转
- html5 canvas实现小球绕圆旋转
- html5 canvas 实现小球绕椭圆旋转
- CSS3画旋转的正方体
- CSS3的正方体自动旋转
- css制作旋转的正方体
- UVA253正方体的旋转问题
- 千里之行,始于足下!
- 对象序列化原因的简单理解
- Anagrams
- mnesia如何修改表结构
- 交通工具抽象类
- 第十讲:html5中canvas实现正方体的动态旋转
- 基本排序系列之简述快速排序,快速掌握快排
- IIS下配置运行python脚本的CGI
- Ext.onReady() 外面需要调用 Ext.onReady()里面定义的属性或方法
- 二叉树
- kindeditor编辑器和图片上传独立分开的配置细节
- 初始设计模式3——工厂方法模式
- 初识简单工厂模式
- 050001 《拆掉思维里的墙》读后感——一些现象的解释