快速业务通道

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; ia = gun[i].dot_s;
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; idot[i].x *= s;
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; ipx = dot[i].x;
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; ik = 1-dot[i].y/d;
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; ideeps[i] = new Object();
deeps[i].num = i;
deeps[i].y = dot[i].y;
}
// 提取小棍的y值并记录其编号
for (i=sm; ideeps[i] = new Object();
// 为节约空间,将小棍的编号+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; iif (deeps[i].ymin_y = deeps[i].y;
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号