最新下载
jquery人才网弹出选择地区
jQuery焦点图插件Fotorama
24小时阅读排行榜
- 1 Go语言如何自定义错误类型方法_Golang错误类型封装与扩展
- 2 C++ 怎么判断文件是否为空 C++ peek与seekg检查文件【文件流】
- 3 php代码示例怎样实现数据导入_php数据导入代码示例【示例】
- 4 Web Workers如何实现javascript多线程【教程】
- 5 C++ 怎么实现冒泡排序 C++ 双重循环排序算法逻辑详解【新手】
- 6 css伪类:nth-child(2n)选择偶数行不生效怎么办_通过正确计算索引和结构调整实现效果
- 7 如何高效批量更新 Pandas DataFrame 中基于列表字段的多列值
- 8 php页面渐变能随滚动变化吗_php页面滚动触发渐变法【实例】
- 9 unsafe.Pointer 怎么安全使用?5种经典用法+风险点
- 10 如何使用原生 JavaScript 实现下拉菜单选中项与按钮状态同步
- 11 如何通过 URL 参数在另一页面显示搜索结果
- 12 Go benchmark 怎么写?常见性能测试误区汇总
- 13 Go语言break和continue如何使用_Golang循环控制关键字
- 14 如何用正则表达式限制用户名中点号和下划线最多各出现一次
- 15 Golang定时任务过多影响性能_Golang定时器优化实践
最新教程
-
- Node.js 教程
- 16196 2025-08-28
-
- CSS3 教程
- 1546732 2025-08-27
-
- Rust 教程
- 23332 2025-08-27
-
- Vue 教程
- 25791 2025-08-22
-
- PostgreSQL 教程
- 22274 2025-08-21
-
- Git 教程
- 9250 2025-08-21
JS片段:
<script>
var {atan2,sqrt,sin,cos,PI,acos} = Math;
function project3D(x,y,z,vars){
x-=vars.camX,y-=vars.camY,z-=vars.camZ;
p=atan2(x,z),d=sqrt(z*z+x*x),x=sin(p-vars.yaw)*d,z=cos(p-vars.yaw)*d;
p=atan2(y,z),d=sqrt(y*y+z*z),y=sin(p-vars.pitch)*d,z=cos(p-vars.pitch)*d;
n=-9,b=1,l=9,d=1,e=0,f=0,g=x,h=z,k=(h-f)*(l-n)-(g-e)*(d-b),m=((g-e)*(b-f)-(h-f)*(n-e))/k;
return {x:vars.cx+(n+m*(l-n))*vars.scale,y:vars.cy+y/z*vars.scale,d:sqrt(x*x+y*y+z*z)};
}
function elevation(x,y,z){
return acos(z / sqrt(x*x+y*y+z*z));
}
function subdivide(shape,subdivisions){
var t=shape.segs.length;
for(var i=0;i<t;++i){
var x1=shape.segs[i].a.x;
var y1=shape.segs[i].a.y;
var z1=shape.segs[i].a.z;
var x2=(shape.segs[i].b.x-x1)/subdivisions;
var y2=(shape.segs[i].b.y-y1)/subdivisions;
var z2=(shape.segs[i].b.z-z1)/subdivisions;
shape.segs[i].b.x=x1+x2;
shape.segs[i].b.y=y1+y2;
shape.segs[i].b.z=z1+z2;
var x3=x2;
var y3=y2;
var z3=z2;
for(var k=0;k<subdivisions-1;++k){
shape.segs.push(new Seg(x1+x2,y1+y2,z1+z2,x1+x2+x3,y1+y2+y3,z1+z2+z3));
x2+=x3;
y2+=y3;
z2+=z3;
}
}
}
这是一款很具空间感的基于html5 canvas实现的几何模型3D运动动画效果,好看的3D模型动画特效。
