html5 3d在线试衣源码,3D版HTML5模拟衣服撕扯动画
本文作者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模拟衣服撕扯动画相关推荐
- 3D飞镖游戏源码ios版
一款ios 3D飞镖游戏源码,通过物理引擎和重力感应来控制飞镖向目标物体击中!游戏比较简单,可以学习一下3D游戏的基本开发. 源码下载: http://code.662p.com/view/6262. ...
- 在线教育源码开源版,这样下载部署即可运行
现在在线教育系统源码一搜一大把,很多人都区别不了哪些是能够正常搭建的在线教育系统,哪些又只是推广宣传使用,无法正常搭建,使得又不少购买在线教育系统刚需的用户,浪费大量的时间在做无用功,不能在短时间内搭 ...
- 二改广告横幅在线制作源码 美化版
介绍: 主机和服务器均可架设搭建,如果使用宝塔架设点击访问的时候提示找不到文件路径的时候, 记得点击网站目录把防跨站攻击先关闭,这样就可以正常访问了,这款是有后台的但是不带数据库的, 账号密码和内容信 ...
- 基于html5制作3D拳击游戏源码下载
今天给大家分享一款基于HTML5实现的3d拳王游戏源码.这款实例适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8及以下浏览器. 在线预览 ...
- HTML5七夕情人节表白网页(抖音-流动爱心表白)HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 爱心表白网页
HTML5七夕情人节表白网页❤抖音-流动爱心表白❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 爱心表白网页 这是程序员表白 ...
- HTML5七夕情人节表白网页(抖音超火3D炫酷魔方) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白
HTML5七夕情人节表白网页❤抖音超火❤3D炫酷魔方❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白 这是程序 ...
- HTML5七夕情人节表白网页(抖音-罗盘时钟) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白
HTML5七夕情人节表白网页❤抖音罗盘时钟❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白 这是程序员表白系列 ...
- HTML5七夕情人节表白网页(结婚倒计时) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白
HTML5七夕情人节表白网页❤结婚倒计时❤ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白 这是程序员表白 ...
- HTML5七夕情人节表白网页(粉色的情人节爱心飞出ui特效) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心
HTML5七夕情人节表白网页❤粉色的情人节爱心飞出ui特效❤ HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白 这 ...
最新文章
- 比特币ABC推出最新版本后讨论网络不兼容性
- mysql 插入_Mysql中创建表格及插入数据
- WebStorm 2018版本破解方法
- Java虚拟机详解03----常用JVM配置参数
- php stortime,文件存储 | 综合话题 | Laravel 5.3 中文文档
- 中国.NET开发者峰会特别活动-基于k8s的微服务和CI/CD动手实践报名
- 【2019第十届蓝桥杯省赛C/C++B组题解】(非官方题解)
- linux基础知识——mmap
- 降维:用 PCA 压缩数据集
- 吓人!普京最新Deepfake视频来了,MIT现场伪造实时采访
- 菜鸟心态综合症4:缺乏自信,总对自己说No
- 图卷积网络-《深入浅出图神经网络》读书笔记
- 程序设计基础C语言电子书,程序设计基础..pdf
- Toolchain的安装与验证(有图 ,超详细)
- 环境篇-Windows下安装OpenSSL
- 激光SLAM:激光雷达运动畸变补偿--轮速里程计辅助方法
- 基于电商常识图谱的知识表示与应用
- Keil5 平台 S3C2440裸机程序开发-----中断系统/UART
- 马丁富勒微服务论文连接
- R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)
热门文章
- 什么是数据共享?如何做好数据交换与共享?
- Data Analysis 软件(色谱质谱图分析软件)安装步骤
- HTML设置文字与段落格式
- 用python画小星星
- 伺服电机移动距离的计算
- 《写给大家看的设计书》读后感
- opencv-python错误:size.width0 size.height0 in function 'cv::imshow' 的解决方案
- 拉伸流变仪VADER 1000-丹麦RHEO FILAMENT
- python IP代理爬虫,download 代理IP
- python股票量化交易系统_利用python建立股票量化交易系统(一)