3D球棍模型
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-11
大者,并记录相应的编号,然后根据编号是>=1000还是<1000即可判断它是小棍还是小球,然后提取相应编号的小棍或小球的屏幕显示坐标值,对于小球而言,还须提取其颜色值和深度值,以便于显示不同颜色,不同大小,不同模糊程度。] cl_all() [清除所有用于显示小球和小棍的MC,本函数在按钮中用到] stop(); // 原点坐标 ox = 200; oy = 200; // 取得点集 get_data(3); // 小棍的起点,终点,深度计算 function gun_js() { var i, a, b, ar, br, dxy, dxz; var ax, ay, az, bx, by, bz, dx, dy, dz; for (i=0; i ar = dot[a].r; ax = dot[a].x; ay = dot[a].y; az = dot[a].z; // b = gun[i].dot_e; br = dot[b].r; bx = dot[b].x; by = dot[b].y; bz = dot[b].z; // dx = bx-ax; dy = by-ay; dz = bz-az; // dxy,dxz分别是a,b投影到xy,xz面上后的距离 dxy = Math.sqrt(dx*dx+dy*dy); dxz = Math.sqrt(dx*dx+dz*dz); // 绘图时的起点坐标 gun[i].sx = (dxy-br)*dx/dxy+ax; gun[i].sy = (dxy-br)*dy/dxy+ay; gun[i].sz = (dxz-br)*dz/dxz+az; // 绘图时的终点坐标 gun[i].ex = -(dxy-ar)*dx/dxy+bx; gun[i].ey = -(dxy-ar)*dy/dxy+by; gun[i].ez = -(dxz-ar)*dz/dxz+bz; // 小棍中点处的y值,用以比较深度 gun[i].oy = (ay+by)/2; } } // // 缩放函数,s为缩放系数 function scale(s) { var i; for (i=0; i dot[i].y *= s; dot[i].z *= s; } } // 物体旋转,xa,ya均为角度值 function rotate(xa, ya) { var i, k; var rad = Math.PI/180; xa *= rad; ya *= rad; var sin_xa = Math.sin(xa); var cos_xa = Math.cos(xa); var sin_ya = Math.sin(ya); var cos_ya = Math.cos(ya); var px, py, pz, tempz; for (i=0; i py = dot[i].y; pz = dot[i].z; tempz = (py*cos_ya)-(px*sin_ya); dot[i].x = (py*sin_ya)+(px*cos_ya); dot[i].y = (pz*sin_xa)+(tempz*cos_xa); dot[i].z = (pz*cos_xa)-(tempz*sin_xa); } } // 将物体投影到xz平面,d为视点到投影面的距离 function v_xz(d) { var i, k; // 处理小球坐标 for (i=0; i dot[i].vx = dot[i].x/k; dot[i].vy = -dot[i].z/k; } // // 处理小棍坐标 for (i=0; i k = 1-gun[i].sy/d; gun[i].svx = gun[i].sx/k; gun[i].svy = -gun[i].sz/k; // 小棍终点 k = 1-gun[i].ey/d; gun[i].evx = gun[i].ex/k; gun[i].evy = -gun[i].ez/k; } } // 提取深度值,即y值(包括小球和小棍) function get_deeps() { var i, sm_all = sm+sm_gun; deeps = new Array(sm); // 提取小球的y值并记录其编号 for (i=0; i deeps[i].num = i; deeps[i].y = dot[i].y; } // 提取小棍的y值并记录其编号 for (i=sm; i // 为节约空间,将小棍的编号+1000用以与小球相区分,而不再另作标记 deeps[i].num = (i-sm)+1000; deeps[i].y = gun[i-sm].oy; } } // // 从最大深度开始,显示每个小球或小棍 function get_v() { // 根据各小球坐标值计算棍的坐标值(包括起点和终点) gun_js(); // 透视(将物体投影到xz平面,视点离zx面为200像素). v_xz(200); // 提取深度值,即y值,放入数组vdot中 get_deeps(); var i, a, j = 5; var min_y, min_n, min_m; // 当还有1个以上未显示时 while (deeps.length>0) { // 先假设第一个就是最小y值(即最大深度) min_y = deeps[0].y; min_n = 0; min_m = deeps[0].num; // 找出未显示的球或棍中,y值最小的 for (i=1; i min_n = i; min_m = deeps[i].num; } } // 显示找到的y值最小的球或棍(编号小于1000的都是球,否则就是棍) if (min_m<1000) { a = this.attachMovie("dot", "dot"+min_m, j++); a._x = dot[min_m].vx+ox; a._y = dot[min_m].vy+oy; a._xscale = 100-(200-dot[min_m].y)/10; a._yscale = a._xscale; // 制造雾气效果 a.wuqi._alpha = (200-dot[min_m].y)/5; // dot[i][5]保存的是颜色信息 a.gotoAndStop(dot[min_m].col); } else { min_m -= 1000 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 蝴蝶飞舞的效果下一篇: 4个数字的混合运算得固定结果的可能性
关于3D球棍模型的所有评论