js实现可拖拽旋转三维音乐卡通人物效果代码
代码语言:html
所属分类:三维
代码描述:js实现可拖拽旋转三维音乐卡通人物效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!doctype html> <html> <head> <meta charset="utf-8"> <title></title> <style> html { height: 100%; } body { min-height: 100%; margin: 0; display: flex; align-items: center; justify-content: center; background: #435; color: white; font-family: sans-serif; text-align: center; } canvas { display: block; margin: 0 auto; cursor: move; } </style> </head> <body> <div class="container"> <canvas></canvas> <p>点击拖动或旋转</p> </div> <script> // -------------------------- utils -------------------------- // var TAU = Math.PI * 2; function extend( a, b ) { for ( var prop in b ) { a[ prop ] = b[ prop ]; } return a; } function lerp( a, b, t ) { return ( b - a ) * t + a; } function modulo( num, div ) { return ( ( num % div ) + div ) % div; } // -------------------------- Vector3 -------------------------- // function Vector3( position ) { this.set( position ); } Vector3.prototype.set = function( pos ) { pos = Vector3.sanitize( pos ); this.x = pos.x; this.y = pos.y; this.z = pos.z; return this; }; Vector3.prototype.rotate = function( rotation ) { if ( !rotation ) { return; } this.rotateZ( rotation.z ); this.rotateY( rotation.y ); this.rotateX( rotation.x ); return this; }; Vector3.prototype.rotateZ = function( angle ) { rotateProperty( this, angle, 'x', 'y' ); }; Vector3.prototype.rotateX = function( angle ) { rotateProperty( this, angle, 'y', 'z' ); }; Vector3.prototype.rotateY = function( angle ) { rotateProperty( this, angle, 'x', 'z' ); }; function rotateProperty( vec, angle, propA, propB ) { if ( angle % TAU === 0 ) { return; } var cos = Math.cos( angle ); var sin = Math.sin( angle ); var a = vec[ propA ]; var b = vec[ propB ]; vec[ propA ] = a*cos - b*sin; vec[ propB ] = b*cos + a*sin; } Vector3.prototype.add = function( vec ) { if ( !vec ) { return; } vec = Vector3.sanitize( vec ); this.x += vec.x; this.y += vec.y; this.z += vec.z; return this; }; Vector3.prototype.multiply = function( vec ) { if ( !vec ) { return; } vec = Vector3.sanitize( vec ); this.x *= vec.x; this.y *= vec.y; this.z *= vec.z; return this; }; Vector3.prototype.lerp = function( vec, t ) { this.x = lerp( this.x, vec.x, t ); this.y = lerp( this.y, vec.y, t ); this.z = lerp( this.z, vec.z, t ); return this; }; // ----- utils ----- // // add missing properties Vector3.sanitize = function( vec ) { vec = vec || {}; vec.x = vec.x || 0; vec.y = vec.y || 0; vec.z = vec.z || 0; return vec; }; // -------------------------- PathAction -------------------------- // function PathAction( method, points, previousPoint ) { this.method = method; this.points = points.map( mapVectorPoint ); this.renderPoints = points.map( mapVectorPoint ); this.previousPoint = previousPoint; this.endRenderPoint = this.renderPoints[ this.renderPoints.length - 1 ]; // arc actions come with previous point & corner point // but require bezier control points if ( method == 'arc' ) { this.controlPoints = [ new Vector3(), new Vector3() ]; } } function mapVectorPoint( point ) { return new Vector3( point ); } PathAction.prototype.reset = function() { // reset renderPoints back to orignal points position var points = this.points; this.renderPoints.forEach( function( renderPoint, i ) { var point = points[i]; renderPoint.set( point ); }); }; PathAction.prototype.transform = function( translation, rotation, scale ) { this.renderPoints.forEach( function( renderPoint ) { renderPoint.multiply( scale ); renderPoint.rotate( rotation ); renderPoint.add( translation ); }); }; PathAction.prototype.render = function( ctx ) { this[ this.method ]( ctx ); }; PathAction.prototype.move = function( ctx ) { var point = this.renderPoints[0]; ctx.moveTo( point.x, point.y ); }; PathAction.prototype.line = function( ctx ) { var point = this.renderPoints[0]; ctx.lineTo( point.x, point.y ); }; PathAction.prototype.bezier = function( ctx ) { var cp0 = this.renderPoints[0]; var cp1 = this.renderPoints[1]; var end = this.renderPoints[2]; ctx.bezierCurveTo( cp0.x, cp0.y, cp1.x, cp1.y, end.x, end.y ); }; PathAction.prototype.arc = function( ctx ) { var prev = this.previousPoint; var corner = this.renderPoints[0]; var end = this.renderPoints[1]; var cp0 = this.controlPoints[0]; var cp1 = this.controlPoints[1]; cp0.set( prev ).lerp( corner, 9/16 ); cp1.set( end ).lerp( corner, 9/16 ); ctx.bezierCurveTo( cp0.x, cp0.y, cp1.x, cp1.y, end.x, end.y ); }; // -------------------------- Shape -------------------------- // function Shape( options ) { this.create( options ); } Shape.prototype.create = function( options ) { // default extend( this, Shape.defaults ); // set options setOptions( this, options ); this.updatePathActions(); // transform this.translate = new Vector3( options.translate ); this.rotate = new Vector3( options.rotate ); va.........完整代码请登录后点击上方下载按钮下载查看
网友评论0