【HTML——3d粒子特效(效果+代码)】(1)

var distance;

ctx.fillStyle = ‘#333’;

requestAnimationFrame(function loop() {

rot += .75;

distance = maxDistance - (maxDistance - minDistance) * Math.abs(Math.sin(rot/100));

ctx.clearRect( -width / 2, -height / 2, width, height);

var cpm = [

[f, 0, 0, 0],

[0, f, 0, 0],

[0, 0, 1, distance]

];

var rotX = getRotateY(rot);

var rotY = getRotateY(rot*2);

var rotZ = getRotateZ(rot*3);

var transformMatrix = matrixMultiply(rotY, rotZ);

transformMatrix = matrixMultiply(transformMatrix, rotX);

points

.forEach(function(point) {

var imagePoint = getImagePoint(matrixTimesVec(transformMatrix, point), cpm);

if (imagePoint[2] < 0) { return; }

var size = 5 * f / imagePoint[2];

var x = imagePoint[0] / imagePoint[2];

var y = imagePoint[1] / imagePoint[2];

ctx.beginPath();

ctx.arc(x, y, size, 0, 2 * Math.PI, true);

ctx.fill();

});

requestAnimationFrame(loop);

});

function getImagePoint(point3D, cameraProjectionMatrix) {

// make homogenous

var homogenousPoint3D = point3D.concat([1]);

return matrixTimesVec(cameraProjectionMatrix, homogenousPoint3D);

}

function add(a, b) { return a + b; }

function getRotateZ(deg) {

var rad = deg * Math.PI / 180;

var cos = Math.cos(rad);

var sin = Math.sin(rad);

return [

[cos, -sin, 0],

[sin, cos, 0],

[ 0, 0, 1]

];

}

function getRotateY(deg) {

var rad = deg * Math.PI / 180;

var cos = Math.cos(rad);

var sin = Math.sin(rad);

return [

[ cos, 0, sin],

[ 0, 1, 0],

[-sin, 0, cos]

];

}

function getRotateX(deg) {

var rad = deg * Math.PI / 180;

var cos = Math.cos(rad);

var sin = Math.sin(rad);

return [

[1, 0, 0],

[0, cos, -sin],

[0, sin, cos]

];

}

function matrixTimesVec(matrix, vec) {

return deepCopy(matrix).map(function(row) {

return row.map(function(cell, i) {

return cell * vec[i];

}).reduce(add, 0);

});

}

function deepCopy(arr) {

return arr.slice(0).map(function(v) {

return Array.isArray(v) ? deepCopy(v) : v;

});

}

function matrixMultiply(m1, m2) {

var m1_0 = m1[0];

var m1_1 = m1[1];

var m1_2 = m1[2];

var m2_0 = m2[0];

var m2_1 = m2[1];

var m2_2 = m2[2];

var m1_0_0 = m1_0[0];

var m1_0_1 = m1_0[1];

var m1_0_2 = m1_0[2];

var m1_1_0 = m1_1[0];

var m1_1_1 = m1_1[1];

var m1_1_2 = m1_1[2];

var m1_2_0 = m1_2[0];

var m1_2_1 = m1_2[1];

var m1_2_2 = m1_2[2];

var m2_0_0 = m2_0[0];

var m2_0_1 = m2_0[1];

var m2_0_2 = m2_0[2];

var m2_1_0 = m2_1[0];

var m2_1_1 = m2_1[1];

var m2_1_2 = m2_1[2];

var m2_2_0 = m2_2[0];

var m2_2_1 = m2_2[1];

var m2_2_2 = m2_2[2];

return [

[m1_0_0 * m2_0_0 + m1_0_1 * m2_1_0 + m1_0_2 * m2_2_0, m1_0_0 * m2_0_1 + m1_0_1 * m2_1_1 + m1_0_2 * m2_2_1, m1_0_0 * m2_0_2 + m1_0_1 * m2_1_2 + m1_0_2 * m2_2_2],

[m1_1_0 * m2_0_0 + m1_1_1 * m2_1_0 + m1_1_2 * m2_2_0, m1_1_0 * m2_0_1 + m1_1_1 * m2_1_1 + m1_1_2 * m2_2_1, m1_1_0 * m2_0_2 + m1_1_1 * m2_1_2 + m1_1_2 * m2_2_2],

[m1_2_0 * m2_0_0 + m1_2_1 * m2_1_0 + m1_2_2 * m2_2_0, m1_2_0 * m2_0_1 + m1_2_1 * m2_1_1 + m1_2_2 * m2_2_1, m1_2_0 * m2_0_2 + m1_2_1 * m2_1_2 + m1_2_2 * m2_2_2]

];

}

style.css

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可获取

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可获取

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

前端校招面试题精编解析大全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值