p2模拟真实的物理转盘转动动画效果代码
代码语言:html
所属分类:动画
代码描述:p2模拟真实的物理转盘转动动画效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> body { background-color: #fff; margin: 0; } .centered { position: absolute; margin: auto; top: 0; bottom: 0; left: 0; right: 0; } #container { width: 768px; height: 768px; } #status_label { position: absolute; top: 768px; width: 768px; color: black; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1.5em; text-align: center; pointer-events: none; } #drawing_canvas { position: absolute; } </style> </head> <body> <div id="container" class="centered"> <canvas id="drawing_canvas"></canvas> <div id="status_label"> loading... </div> </div> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/p2.min.js"></script> <script> const TWO_PI = Math.PI * 2; const HALF_PI = Math.PI * 0.5; // canvas settings var viewWidth = 768, viewHeight = 768, viewCenterX = viewWidth * 0.5, viewCenterY = viewHeight * 0.5, drawingCanvas = document.getElementById("drawing_canvas"), ctx, timeStep = (1/60), time = 0; var ppm = 24, // pixels per meter physicsWidth = viewWidth / ppm, physicsHeight = viewHeight / ppm, physicsCenterX = physicsWidth * 0.5, physicsCenterY = physicsHeight * 0.5; var world; var wheel, arrow, mouseBody, mouseConstraint; var arrowMaterial, pinMaterial, contactMaterial; var wheelSpinning = false, wheelStopped = true; var particles = []; var statusLabel = document.getElementById('status_label'); window.onload = function() { initDrawingCanvas(); initPhysics(); requestAnimationFrame(loop); statusLabel.innerHTML = 'Give it a good spin!'; }; function initDrawingCanvas() { drawingCanvas.width = viewWidth; drawingCanvas.height = viewHeight; ctx = drawingCanvas.getContext('2d'); drawingCanvas.addEventListener('mousemove', updateMouseBodyPosition); drawingCanvas.addEventListener('mousedown', checkStartDrag); drawingCanvas.addEventListener('mouseup', checkEndDrag); drawingCanvas.addEventListener('mouseout', checkEndDrag); } function updateMouseBodyPosition(e) { var p = getPhysicsCoord(e); mouseBody.position[0] = p.x; mouseBody.position[1] = p.y; } function checkStartDrag(e) { if (world.hitTest(mouseBody.position, [wheel.body])[0]) { mouseConstraint = new p2.RevoluteConstraint(mouseBody, wheel.body, { worldPivot: mouseBody.position, collideConnected: false }); world.addConstraint(mouseConstraint); } if (wheelSpinning === true) { wheelSpinning = false; wheelStopped = true; statusLabel.innerHTML = "Impatience will not be rewarded."; } } function checkEndDrag(e) { if (mouseConstraint) { world.removeConstraint(mouseConstraint); mouseConstraint = null; if (wheelSpinning === false && wheelStopped === true) { if (Math.abs(wheel.body.angularVelocity) > 7.5) { wheelSpinning = true; wheelStopped = false; console.log('good spin'); statusLabel.innerHTML = '...clack clack clack clack clack clack...' } else { console.log('sissy'); statusLabel.innerHTML = 'Come on, you can spin harder than that.' } } } } function getPhysicsCoord(e) { var rect = drawingCanvas.getBoundingClientRect(), x = (e.clientX - rect.left) / ppm, y = physicsHeight - (e.clientY - rect.top) / ppm; return { x: x, y: y }; } function initPhysics() { world = new p2.World(); world.solver.iterations = 100; world.solver.tolerance = 0; arrowMaterial = new p2.Material(); pinMaterial = new p2.Material(); contactMaterial = new p2.ContactMaterial(arrowMaterial, pinMaterial, { friction: 0.0, restitution: 0.1 }); world.addContactMaterial(contactMaterial); var wheelRadius = 8, wheelX = physicsCenterX, wheelY = wheelRadius + 4, arrowX = wheelX, arrowY = wheelY + wheelRadius + 0.625; wheel = new Wheel(wheelX, wheelY, wheelRadius, 32, 0.25, 7.5); wheel.body.angle = (Math.PI / 32.5); wheel.body.angularVelocity = 5; arrow = new Arrow(arrowX, arrowY, 0.5, 1.5); mouseBody = new p2.Body(); world.addBody(mouseBody); } function spawnPartices() { for (var i = 0; i < 200; i++) { var p0 = new Point(viewCenterX, viewCenterY - 64); var p.........完整代码请登录后点击上方下载按钮下载查看
网友评论0