3D旋转的球

 

 书上这段代码已经研究许久了,终于有点头绪了,

其中关键代码是

	speed ++;  

	temp.x = Math.sin(speed*Math.PI/180)*radius+100;
	temp.y =- Math.sin(speed*Math.PI/180)*radius+100;


 

细心的你也许会发现,化简完竟然是x=r*sina,天哪,简谐运动。

互动百科:

简谐运动 - 简谐运动方程

一个做匀速圆周运动的物体在一条直径上的投影所做的运动即为简谐运动:R是匀速圆周运动的半径,也是简谐运动的振幅;ω是匀速圆周运动的角速度,也叫做简谐运动的圆频率,ω=√(k/m);φ是t=0时匀速圆周运动的物体偏离该直径的角度(逆时针为正方向),叫做简谐运动的初相位。在t时刻,简谐运动的位移x=Rcos(ωt+φ),简谐运动的速度v=-ωRsin(ωt+φ),简谐运动的加速度a=-(ω^2)Rcos(ωt+φ),这三个式子叫做简谐运动的方程。

 

然后,代码就全部明白了。使小球做简谐运动的同时,满足两个原则:

1.近大远小

2.远处alpha减小。

 

然后可以写一个粗糙的程序看看效果:

s1.addEventListener(Event.ENTER_FRAME,D_move);
var temp;
var radius:uint = 120;                 //立体旋转半径
var speed:Number = 1;

function D_move(evt:Event) {
	temp=evt.target;
	speed += 3;  
	temp.x = Math.sin(speed*Math.PI/180)*radius;
	temp.y =300;
	temp.scaleX = temp.scaleY=(Math.cos(speed*Math.PI/180)*100+70)/100;//scaleX scaleY  --拉伸
	temp.alpha = (Math.cos(speed*Math.PI/180)*100+100)/100;//alpha   ---改变透明度
	
	trace(temp.x,temp.y );
}


基本效果已经有了,如果有很多球呢,还要复杂一下:

书上的代码原封拷过来:

var $radius:uint = 120;                 //立体旋转半径
var $factor:uint = 90;
var $speed:Number = 0;
var $num:uint = 10;
var $temp;
for (var $i:uint=1; $i<=$num; $i++) {   //10张图片。i从1到10
	this["s"+$i].$range = 0;            //range代表 旋转角度
	this["s"+$i].$sin = 0;              //正弦函数值
	this["s"+$i].$cos = 0;
	this["s"+$i].$s = $i;
	this["s"+$i].$dx = Math.random()*200-100;
	this["s"+$i].$dy = Math.random()*200-100;
	this["s"+$i].$da = 360/$num*$i;
	this["s"+$i].buttonMode=true; 
	this["s" + $i].addEventListener(Event.ENTER_FRAME,$3D_move);
}

function $3D_move($evt:Event) {
	$temp=$evt.target;
	$speed += -(stage.mouseX-stage.stageWidth/2)/400;   //stage.mouseX--鼠标x坐标   stage.stageWidth--舞台宽度
	$temp.$range = ($speed+$temp.$da)*Math.PI/180;
	$temp.$sin = Math.sin($temp.$range);
	$temp.$cos = Math.cos($temp.$range);
	$temp.x =$temp.$sin*$radius+stage.stageWidth/2+$temp.$dx;
	if ($temp.$s%2 == 1) {
		$temp.y = -$temp.$sin*$radius+stage.stageWidth/2+$temp.$dy;
	} else {
		$temp.y = $temp.$sin*$radius+stage.stageHeight/2+$temp.$dy;  //stage.stageHeight--舞台高度
	}
	$temp.scaleX = $temp.scaleY=($temp.$cos*$factor+70)/100;//scaleX scaleY  --拉伸
	$evt.target.alpha = ($temp.$cos*$factor+100)/100;//alpha   ---改变透明度
	$temp.$stack = Math.round(($temp.$cos+1)*5);
	this.setChildIndex($temp,$temp.$stack);
}


里面还是有一些小问题的,不过总体来说,已经可以达到效果。

 

总结:编程除了算法,还要多了解些物理的,暑假在家写了个碰撞的代码,深深被物理的伟大折服。

 

参考文献:

【1】叶翊霳《FLASH actionscript 程序设计经典商业范例集》清华大学出版社 134-137

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值