本文作者html5tricks,转载请注明出处

还记得很早以前向大家分享的这款HTML5 Canvas模拟衣服撕扯动画吗?这绝对是一款非常具有创意而且很好玩的

下面我们来简单分享一下实现的源码,代码主要由HTML和JavaScript组成,主要还是JavaScript。

HTML代码:

只是定义了一个canvas标签,非常简单。

JavaScript代码:

canvas = document.getElementById('c');

ctx = canvas.getContext('2d');

//settings

var physics_acc = 5,

tear_distance = 40,

auto_rotate = 1,

field_of_view = 500,

gravity = 0.2,

friction = 0.99,

cloth_rows = 20,

pm_locked_c = 39; //pointmass locked count - prevents the cloth from falling to the ground

//arrays

var pointmass = [],

constraints = [];

vertex = [];

//random

var halfx = canvas.width / 2,

halfy = canvas.height / 2,

rotatex = 0,

rotatey = 0,

rotatez = 0,

mouse = {

down: false,

x: 0,

y: 0,

ox: 0,

oy: 0,

button: 0

};

ctx.lineWidth = 0.5;

ctx.strokeStyle = "#ddd";

window.requestAnimFrame =

window.requestAnimationFrame ||

window.webkitRequestAnimationFrame ||

window.mozRequestAnimationFrame ||

window.oRequestAnimationFrame ||

window.msRequestAnimationFrame ||

function (callback) {

window.setTimeout(callback, 1000 / 60);

};

function init() {

//create top row

for(i = 0; i < 40; i++) {

x = Math.cos(2 * Math.PI * (i / 40)) * 100;

z = Math.sin(2 * Math.PI * (i / 40)) * 100;

create_pointmass(x, cloth_rows / 2 * -20, z);

}

//rest

for(i = 0; i < 40; i++) {

x = Math.cos(2 * Math.PI * (i / 40)) * 100;

z = Math.sin(2 * Math.PI * (i / 40)) * 100;

for(y = cloth_rows / 2 * -20 + 20; y < cloth_rows / 2 * 20; y+=20) {

create_pointmass(x,y,z);

}

}

//create constraints based on distance

for(i = 0; i < pointmass.length; i++) {

for(c = i + 1; c < pointmass.length; c++) {

dist = Math.sqrt(

Math.pow(pointmass[i][0] - pointmass[c][0], 2)

+ Math.pow(pointmass[i][1] - pointmass[c][1], 2)

+ Math.pow(pointmass[i][2] - pointmass[c][2], 2));

if(dist < 21) {

create_constraint(i,c);

}

}

}

//mouse

canvas.onmousemove = function(e) {

mouse.ox = mouse.x;

mouse.oy = mouse.y;

mouse.x = e.pageX - canvas.offsetLeft,

mouse.y = e.pageY - canvas.offsetTop;

e.preventDefault();

};

canvas.onmousedown = function(e) {

mouse.button = e.which;

mouse.down = true;

e.preventDefault();

};

canvas.oncontextmenu = function(e) {

e.preventDefault();

};

canvas.onmouseup = function(e) {

mouse.down = false;

e.preventDefault();

};

render()

}

function draw3D() {

vertex = [];

for(i = 0; i < pointmass.length; i++) {

vertex.push([pointmass[i][0],pointmass[i][1],pointmass[i][2]])

}

if(auto_rotate == 1)rotatey+= 0.01;

for(i = 0; i < vertex.length; i++) {

xyz = vertex[i];

x = xyz[0];

y = xyz[1];

z = xyz[2];

xcosa = Math.cos(rotatex);

xsina = Math.sin(rotatex);

ycosa = Math.cos(rotatey);

ysina = Math.sin(rotatey);

zcosa = Math.cos(rotatez);

zsina = Math.sin(rotatez);

xy = xcosa*y - xsina*z; //x

xz = xsina*y + xcosa*z;

yz = ycosa*xz - ysina*x; //y

yx = ysina*xz + ycosa*x;

zx = zcosa*yx - zsina*xy; //z

zy = zsina*yx + zcosa*xy;

xyz[0] = zx;

xyz[1] = zy;

xyz[2] = yz;

}

ctx.beginPath();

for(i = 0; i < constraints.length; i++) {

for(c = 0; c < 2; c++) {

xyz = vertex[constraints[i][c]];

fov = field_of_view / (field_of_view + xyz[2]);

x = xyz[0] * fov + halfx;

y = xyz[1] * fov + halfy;

if(c == 0) {

ctx.moveTo(x,y);

} else {

ctx.lineTo(x,y);

}

}

}

ctx.closePath();

ctx.stroke();

}

function update_pointmass() {

for(i = 0; i < pointmass.length; i++) {

x = pointmass[i][0];

y = pointmass[i][1];

z = pointmass[i][2];

ox = pointmass[i][3];

oy = pointmass[i][4];

oz = pointmass[i][5];

dx = x - ox;

dy = y - oy;

dz = z - oz;

if(i > pm_locked_c) {

pointmass[i][3] = x;

pointmass[i][4] = y;

pointmass[i][5] = z;

pointmass[i][0] = x + dx * friction;

pointmass[i][1] = y + dy + gravity;

pointmass[i][2] = z + dz * friction;

} else {

pointmass[i][0] = ox;

pointmass[i][1] = oy;

pointmass[i][2] = oz;

}

}

}

function update_constraint() {

for(i = 0; i < physics_acc; i++) {

for(c = 0; c < constraints.length; c++) {

c1 = pointmass[constraints[c][0]];

c2 = pointmass[constraints[c][1]];

diffx = c1[0] - c2[0];

diffy = c1[1] - c2[1];

diffz = c1[2] - c2[2];

dist = Math.sqrt(diffx * diffx + diffy * diffy + diffz * diffz);

diff = (constraints[c][2] - dist) / dist;

dx = c1[0] - c2[0];

dy = c1[1] - c2[1];

dz = c1[2] - c2[2];

dx = dx * 0.5;

dy = dy * 0.5;

dz = dz * 0.5;

c1[0] = c1[0] + dx * diff;

c1[1] = c1[1] + dy * diff;

c1[2] = c1[2] + dz * diff;

c2[0] = c2[0] - dx * diff;

c2[1] = c2[1] - dy * diff;

c2[2] = c2[2] - dz * diff;

constraints[c][3] = dist;

if(dist > tear_distance) {

constraints.splice(c, 1);

}

}

}

}

function create_pointmass(x,y,z) {

pointmass.push([x, y, z, x, y, z]);

}

function create_constraint(f,s) {

constraints.push([f, s, Math.sqrt(

Math.pow((pointmass[f][0] - pointmass[s][0]), 2)

+ Math.pow((pointmass[f][1] - pointmass[s][1]), 2)

+ Math.pow((pointmass[f][2] - pointmass[s][2]), 2)), 1])

}

function render() {

ctx.clearRect(0, 0, canvas.width, canvas.height);

update_mouse();

update_pointmass();

update_constraint();

draw3D();

requestAnimFrame(render);

}

function update_mouse() {

if(mouse.down == true) {

for(i = 0; i < pointmass.length; i++) {

dist = Math.sqrt(Math.pow((vertex[i][0] - (mouse.x - halfx)), 2)

+ Math.pow((vertex[i][1] - (mouse.y - halfy)), 2)

+ Math.pow((vertex[i][2] + 50), 2));

if(dist < 100 && mouse.button == 1) {

pointmass[i][3] = pointmass[i][3] - Math.min(1, (mouse.x - mouse.ox) / 10);

pointmass[i][4] = pointmass[i][4] - Math.min(1, (mouse.y - mouse.oy) / 10);

}

//lazy cut for m2

if(dist < 21 && mouse.button == 3) {

pointmass[i][4] = -1000;

pointmass[i][3] = -1000;

}

}

}

}

最后在页面加载完后调用一下初始化的代码即可:

init();

html5 3d在线试衣源码,3D版HTML5模拟衣服撕扯动画相关推荐

  1. 3D飞镖游戏源码ios版

    一款ios 3D飞镖游戏源码,通过物理引擎和重力感应来控制飞镖向目标物体击中!游戏比较简单,可以学习一下3D游戏的基本开发. 源码下载: http://code.662p.com/view/6262. ...

  2. 在线教育源码开源版,这样下载部署即可运行

    现在在线教育系统源码一搜一大把,很多人都区别不了哪些是能够正常搭建的在线教育系统,哪些又只是推广宣传使用,无法正常搭建,使得又不少购买在线教育系统刚需的用户,浪费大量的时间在做无用功,不能在短时间内搭 ...

  3. 二改广告横幅在线制作源码 美化版

    介绍: 主机和服务器均可架设搭建,如果使用宝塔架设点击访问的时候提示找不到文件路径的时候, 记得点击网站目录把防跨站攻击先关闭,这样就可以正常访问了,这款是有后台的但是不带数据库的, 账号密码和内容信 ...

  4. 基于html5制作3D拳击游戏源码下载

    今天给大家分享一款基于HTML5实现的3d拳王游戏源码.这款实例适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8及以下浏览器. 在线预览 ...

  5. HTML5七夕情人节表白网页(抖音-流动爱心表白)HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 爱心表白网页

    HTML5七夕情人节表白网页❤抖音-流动爱心表白❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 爱心表白网页 这是程序员表白 ...

  6. HTML5七夕情人节表白网页(抖音超火3D炫酷魔方) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白

    HTML5七夕情人节表白网页❤抖音超火❤3D炫酷魔方❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白 这是程序 ...

  7. HTML5七夕情人节表白网页(抖音-罗盘时钟) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白

    HTML5七夕情人节表白网页❤抖音罗盘时钟❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白 这是程序员表白系列 ...

  8. HTML5七夕情人节表白网页(结婚倒计时) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白

    HTML5七夕情人节表白网页❤结婚倒计时❤ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白 这是程序员表白 ...

  9. HTML5七夕情人节表白网页(粉色的情人节爱心飞出ui特效) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心

    HTML5七夕情人节表白网页❤粉色的情人节爱心飞出ui特效❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白 这 ...

最新文章

  1. 比特币ABC推出最新版本后讨论网络不兼容性
  2. mysql 插入_Mysql中创建表格及插入数据
  3. WebStorm 2018版本破解方法
  4. Java虚拟机详解03----常用JVM配置参数
  5. php stortime,文件存储 | 综合话题 | Laravel 5.3 中文文档
  6. 中国.NET开发者峰会特别活动-基于k8s的微服务和CI/CD动手实践报名
  7. 【2019第十届蓝桥杯省赛C/C++B组题解】(非官方题解)
  8. linux基础知识——mmap
  9. 降维:用 PCA 压缩数据集
  10. 吓人!普京最新Deepfake视频来了,MIT现场伪造实时采访
  11. 菜鸟心态综合症4:缺乏自信,总对自己说No
  12. 图卷积网络-《深入浅出图神经网络》读书笔记
  13. 程序设计基础C语言电子书,程序设计基础..pdf
  14. Toolchain的安装与验证(有图 ,超详细)
  15. 环境篇-Windows下安装OpenSSL
  16. 激光SLAM:激光雷达运动畸变补偿--轮速里程计辅助方法
  17. 基于电商常识图谱的知识表示与应用
  18. Keil5 平台 S3C2440裸机程序开发-----中断系统/UART
  19. 马丁富勒微服务论文连接
  20. R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)

热门文章

  1. 什么是数据共享?如何做好数据交换与共享?
  2. Data Analysis 软件(色谱质谱图分析软件)安装步骤
  3. HTML设置文字与段落格式
  4. 用python画小星星
  5. 伺服电机移动距离的计算
  6. 《写给大家看的设计书》读后感
  7. opencv-python错误:size.width0 size.height0 in function 'cv::imshow' 的解决方案
  8. 拉伸流变仪VADER 1000-丹麦RHEO FILAMENT
  9. python IP代理爬虫,download 代理IP
  10. python股票量化交易系统_利用python建立股票量化交易系统(一)