Flash与3D编程探秘(七)- 3D物体框架
2008-11-12 11:51:06 来源:WEB开发网//initballsandputthemonthescreen
for(vari=0;i<points.length;i++)
{
varball=newSphere();
ball.x=points[i].x;
ball.y=points[i].y;
ball.z=0;
scene.addChild(ball);
}
6. 这个函数你在摄像机空间旋转一篇文章中应该见过,函数的功能是把3D空间的点,映射到2D平面xy上。函数执行的步骤是这样的:
a) 提前计算出x,y和z旋转角度的正余弦值。
b) 使用for loop遍历物体所有的顶点。
c) 使用计算出的正余弦和三角函数对三个轴的旋转分别进行计算,得出旋转后顶点的x,y和z。
d) 然后计算出物体在2D平面上映射后的x和y值。
e) 并且把这些2D点添加到一个新的数组里。
f) 最后返回这个数组。
functionproject_pts(points)
{
varprojected=[];
//declaresomevariableforsavingfunctioncall
varsin_x=Math.sin(axis_rotation.x);
varcos_x=Math.cos(axis_rotation.x);
varsin_y=Math.sin(axis_rotation.y);
varcos_y=Math.cos(axis_rotation.y);
varsin_z=Math.sin(axis_rotation.z);
varcos_z=Math.cos(axis_rotation.z);
varx,y,z, //3dx,y,z
xy,xz, //rotateaboutxaxis
yx,yz, //rotateaboutyaxis
zx,zy, //rotateaboutzaxis
scale; //2dscaletransform
for(vari=0;i<points.length;i++)
{
x=points[i].x;
y=points[i].y;
z=points[i].z;
//hereisthetheroy:
//supposeaisthecurrentangle,basedongivencurrent_x,current_yonaplane
//(canbex,yplane,ory,zplaneorz,xplane),rotateangleb
//thenthenewxwouldberadius*cos(a+b)andywouldbe radius*sin(a+b)
//radius*cos(a+b)=radius*cos(a)*cos(b)-radius*sin(a)*sin(b)
//radius*sin(a+b)=radius*sin(a)*cos(b)+radius*cos(a)*sin(b)
//rotateaboutxaxis
xy=cos_x*y-sin_x*z;
xz=sin_x*y+cos_x*z;
//rotateaboutyaxis
yz=cos_y*xz-sin_y*x;
yx=sin_y*xz+cos_y*x;
//rotateaboutzaxis
zx=cos_z*yx-sin_z*xy;
zy=sin_z*yx+cos_z*xy;
//scaleit
scale=focal_length/(focal_length+yz-camera.z);
x=zx*scale-camera.x; //getxpositionintheviewofcamera
y=zy*scale-camera.y; //getxpositionintheviewofcamera
projected[i]=vertex3d(x,y,yz,scale);
}
returnprojected;
}
- ››FLASH不等于运算符!=的使用实例
- ››FLASH不全等运算符!==
- ››FLASH字符串分隔符运算符
- ››FLASH% 模运算符
- ››Flash+、++、+= 加法运算符
- ››Flash, 逗号运算符
- ››flash中的-、--、-=减法运算符
- ››Flash的-Infinity 常数、.点运算符、/ 除法运算符...
- ››Flash两种注释方法/*..*/ 和// 注释行分隔符运算符...
- ››Flash的/=除法赋值运算符、=赋值运算符、== 等于运...
- ››Flash之?: 条件运算符、^ 按位 XOR 运算符、^= 按...
- ››Flash的_framesloaded代码示例
更多精彩
赞助商链接