- 浏览: 119393 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
zhouhaiyang88:
huang-tao 写道你好,在吗?请问,我启动Tomcat时 ...
ActiveMq-JMS简单实例使用tomcat -
xurichusheng:
huang-tao 写道你好,在吗?请问,我启动Tomcat时 ...
ActiveMq-JMS简单实例使用tomcat -
wgcooo:
javax.naming.NameNotFoundExcept ...
ActiveMq-JMS简单实例使用tomcat -
huang-tao:
你好,在吗?请问,我启动Tomcat时报如下错,是什么原因?= ...
ActiveMq-JMS简单实例使用tomcat -
Eric.Yan:
好文章,明天试一试
ActiveMq-JMS简单实例使用tomcat
所谓"正向运动学"通俗点讲就是把几个连接部件的一端固定起来,另一个端可以自由(向前/向外)运动。比如人的行走,单个下肢可以理解为脚连接小腿,小腿连接大腿,大腿连接腰。行走的过程,相当于二条腿相对固定于腰部,大腿运动驱动小腿,小腿又驱动脚,从而带动整个连接系统的一系列运动。
先来一个基本的关节类Segment:(就是一个圆角矩形+二个小圆圈)
package
{
import
flash.display.Sprite;
import
flash.geom.Point;
public
class
Segment
extends
Sprite {
private
var
color:
uint
;
private
var
segmentWidth:
Number
;
private
var
segmentHeight:
Number
;
public
var
vx:
Number
=
0
;
public
var
vy:
Number
=
0
;
public
function
Segment(segmentWidth:
Number
,segmentHeight:
Number
,color:
uint
=
0xffffff
) {
this
.segmentWidth=segmentWidth;
this
.segmentHeight=segmentHeight;
this
.color=color;
init();
}
public
function
init():
void
{
// 绘制关节
graphics.lineStyle(
0
);
graphics.beginFill(color);
graphics.drawRoundRect(- segmentHeight/
2
,- segmentHeight/
2
,segmentWidth+segmentHeight,segmentHeight,segmentHeight,segmentHeight);
graphics.endFill();
// 绘制两个“枢轴”
graphics.drawCircle(
0
,
0
,
2
);
graphics.drawCircle(segmentWidth,
0
,
2
);
}
//获得自由端的坐标
public
function
getPin():Point {
var
angle:
Number
=rotation*Math.PI/
180
;
var
xPos:
Number
=x+Math.cos(angle)*segmentWidth;
var
yPos:
Number
=y+Math.sin(angle)*segmentWidth;
return
new
Point(xPos,yPos);
}
}
}
为了动态控制关节的旋转,再来一个简单的滑块控件类:(下列代码看起来吃力的同学,建议先看Flash/Flex学习笔记(36):自己动手实现一个滑块控件(JimmySilder))
package
{
import
flash.display.Sprite;
import
flash.events.MouseEvent;
import
flash.geom.Rectangle;
import
flash.events.Event;
public
class
SimpleSlider
extends
Sprite {
private
var
_width:
Number
=
6
;
private
var
_height:
Number
=
100
;
private
var
_value:
Number
;
private
var
_max:
Number
=
100
;
private
var
_min:
Number
=
0
;
private
var
_handle:Sprite;
private
var
_back:Sprite;
private
var
_backWidth:
Number
=
0
;
private
var
_handleHeight:
Number
=
20
;
private
var
_backColor:
uint
=
0xcccccc
;
private
var
_backBorderColor:
uint
=
0x999999
;
private
var
_handleColor:
uint
=
0x000000
;
private
var
_handleBorderColor:
uint
=
0xcccccc
;
private
var
_handleRadius:
Number
=
2
;
private
var
_backRadius:
Number
=
2
;
public
function
SimpleSlider(min:
Number
=
0
, max:
Number
=
100
, value:
Number
=
100
) {
_min=min;
_max=max;
value=Math.min(Math.max(value,min),max);
init();
}
private
function
init():
void
{
_back =
new
Sprite () ;
addChild(_back);
_handle =
new
Sprite () ;
_handle.buttonMode=
true
;
addChild(_handle);
_handle.addEventListener( MouseEvent.MOUSE_DOWN , MouseDownHandler );
draw();
updatePosition();
}
private
function
draw():
void
{
drawBack();
drawHandle();
}
private
function
drawBack():
void
{
_back.graphics.clear();
_back.graphics.beginFill( _backColor );
_back.graphics.lineStyle(
0
, _backBorderColor );
_back.graphics.drawRoundRect(
0
,
0
, _backWidth , _height , _backRadius , _backRadius );
_back.graphics.endFill();
_back.x=_width/
2
-_backWidth/
2
;
}
private
function
drawHandle():
void
{
_handle.graphics.clear();
_handle.graphics.beginFill( _handleColor );
_handle.graphics.lineStyle(
0
, _handleBorderColor );
_handle.graphics.drawRect(
0
,
0
, _width , _handleHeight );
_handle.graphics.endFill();
}
private
function
updatePosition():
void
{
var
handleRange:
Number
=_height-_handleHeight;
var
valueRange:
Number
=_max-_min;
_handle.y = handleRange - ( _value - _min ) / valueRange * handleRange ;
}
private
function
updateValue():
void
{
var
handleRange:
Number
=_height-_handleHeight;
var
valueRange:
Number
=_max-_min;
_value = ( handleRange - _handle.y ) / handleRange * valueRange + _min ;
dispatchEvent(
new
Event ( Event.CHANGE ));
}
private
function
MouseUpHandler( e:MouseEvent ):
void
{
stage.removeEventListener( MouseEvent.MOUSE_MOVE , MouseMoveHandler );
stage.removeEventListener( MouseEvent.MOUSE_UP , MouseUpHandler );
_handle.stopDrag();
}
private
function
MouseDownHandler( e:MouseEvent ):
void
{
stage.addEventListener( MouseEvent.MOUSE_MOVE , MouseMoveHandler );
stage.addEventListener( MouseEvent.MOUSE_UP , MouseUpHandler );
_handle.startDrag(
false
,
new
Rectangle (
0
,
0
,
0
, _height - _handleHeight ));
}
private
function
MouseMoveHandler( e:MouseEvent ):
void
{
updateValue();
}
public
function
invalidate():
void
{
draw();
}
public
function
move( x:
Number
, y:
Number
):
void
{
this
.x=x;
this
.y=y;
}
public
function
setSize( w:
Number
, h:
Number
):
void
{
_width=w;
_height=h;
draw();
}
public
function
set
backBorderColor( n:
uint
):
void
{
_backBorderColor=n;
draw();
}
public
function
get
backBorderColor():
uint
{
return
_backBorderColor;
}
public
function
set
backColor( n:
uint
):
void
{
_backColor=n;
draw();
}
public
function
get
backColor():
uint
{
return
_backColor;
}
public
function
set
backRadius( n:
Number
):
void
{
_backRadius=n;
}
public
function
get
backRadius():
Number
{
return
_backRadius;
}
public
function
set
backWidth( n:
Number
):
void
{
_backWidth=n;
draw();
}
public
function
get
backWidth():
Number
{
return
_backWidth;
}
public
function
set
handleBorderColor( n:
uint
):
void
{
_handleBorderColor=n;
draw();
}
public
function
get
handleBorderColor():
uint
{
return
_handleBorderColor;
}
public
function
set
handleColor( n:
uint
):
void
{
_handleColor=n;
draw();
}
public
function
get
handleColor():
uint
{
return
_handleColor;
}
public
function
set
handleRadius( n:
Number
):
void
{
_handleRadius=n;
draw();
}
public
function
get
handleRadius():
Number
{
return
_handleRadius;
}
public
function
set
handleHeight( n:
Number
):
void
{
_handleHeight=n;
draw();
updatePosition();
}
public
function
get
handleHeight():
Number
{
return
_handleHeight;
}
override
public
function
set
height( n:
Number
):
void
{
_height=n;
draw();
}
override
public
function
get
height():
Number
{
return
_height;
}
public
function
set
max( n:
Number
):
void
{
_max=n;
updatePosition();
}
public
function
get
max():
Number
{
return
_max;
}
public
function
set
min( n:
Number
):
void
{
_min=n;
updatePosition();
}
public
function
get
min():
Number
{
return
_min;
}
public
function
set
value( n:
Number
):
void
{
value=n;
value=Math.min(_max,Math.max(_value,_min));
updatePosition();
}
public
function
get
value():
Number
{
return
_value;
}
override
public
function
set
width( n:
Number
):
void
{
_width=n;
draw();
}
override
public
function
get
width():
Number
{
return
_width;
}
}
}
基本测试:
var
segment:Segment=
new
Segment(
100
,
20
);
addChild(segment);
segment.x=
50
;
segment.y=
120
;
var
slider:SimpleSlider=
new
SimpleSlider(-
90
,
90
,
0
);
addChild(slider);
slider.x=
200
;
slider.y=
70
;
slider.addEventListener(Event.CHANGE,onChange);
function
onChange(event:Event):
void
{
segment.rotation=slider.value;
}
双关节运动测试:
package
{
import
flash.display.Sprite;
import
flash.events.Event;
public
class
TwoSegments
extends
Sprite {
private
var
slider0:SimpleSlider;
private
var
slider1:SimpleSlider;
private
var
segment0:Segment;
private
var
segment1:Segment;
public
function
TwoSegments() {
init();
}
private
function
init():
void
{
segment0=
new
Segment(
100
,
20
);
addChild(segment0);
segment0.x=
50
;
segment0.y=
150
;
segment1=
new
Segment(
100
,
20
);
addChild(segment1);
//关键:segment1的固定端连接到segment0的自由端
segment1.x=segment0.getPin().x;
segment1.y=segment0.getPin().y;
slider0=
new
SimpleSlider(-
90
,
90
,
0
);
addChild(slider0);
slider0.x=
320
;
slider0.y=
90
;
slider0.addEventListener(Event.CHANGE,onChange);
slider1=
new
SimpleSlider(-
90
,
90
,
0
);
addChild(slider1);
slider1.x=
340
;
slider1.y=
90
;
slider1.addEventListener(Event.CHANGE,onChange);
}
private
function
onChange(event:Event):
void
{
segment0.rotation=slider0.value;
segment1.rotation=slider1.value;
segment1.x=segment0.getPin().x;
segment1.y=segment0.getPin().y;
}
}
}
如果把segment0与segment1分别看做人的胳膊与手臂,上面这个示例显然有二个地方不自然:
1.没有人的(前)手臂向下做-90度的弯曲(除非脱臼)
2.人的上肢整体向上抬时,手臂会随着胳膊一起绕肩关节向上旋转,而不应该一直固定于某个角度
修正的方法很简单,onChange改成下面这样:
private
function
onChange(event:Event):
void
{
segment0.rotation=slider0.value;
segment1.rotation=slider1.value + segment0.rotation;
//注意这行
segment1.x=segment0.getPin().x;
segment1.y=segment0.getPin().y;
}
同时限制一下slider1的角度范围,改成下面这样:
slider1=
new
SimpleSlider(-
160
,
0
,
0
);
单腿原地“踢”模拟
package
{
import
flash.display.Sprite;
import
flash.events.Event;
public
class
Walking1
extends
Sprite {
private
var
segment0:Segment;
private
var
segment1:Segment;
private
var
cycle:
Number
=
0
;
private
var
offset:
Number
= -Math.PI/
2
;
//小腿的运动看上去应该滞后于大腿,所以需要加入反向偏移量
public
function
Walking1() {
init();
trace
(Math.PI/
180
);
trace
(
0.05
*
180
/Math.PI);
}
private
function
init():
void
{
segment0=
new
Segment(
100
,
20
);
addChild(segment0);
segment0.x=
200
;
segment0.y=
200
;
segment1=
new
Segment(
100
,
20
);
addChild(segment1);
segment1.x=segment0.getPin().x;
segment1.y=segment0.getPin().y;
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private
function
onEnterFrame(event:Event):
void
{
cycle+=.
05
;
var
angle0:
Number
=Math.sin(cycle)*
45
+
90
;
//-45到45整体加上90度以后,就变成45到135,即:大腿垂直方向左右摆动45度
var
angle1:
Number
= Math.sin(cycle + offset) *
45
+
45
;
//即:小腿相对大腿末端做0-90度的正向旋转。建议大家尝试修改一下这里的+45值的大小,看看效果有什么不同
segment0.rotation=angle0;
segment1.rotation=segment0.rotation+angle1;
segment1.x=segment0.getPin().x;
segment1.y=segment0.getPin().y;
}
}
}
双腿原地行走:
package
{
import
flash.display.Sprite;
import
flash.events.Event;
public
class
Walking4
extends
Sprite {
private
var
segment0:Segment;
private
var
segment1:Segment;
private
var
segment2:Segment;
private
var
segment3:Segment;
private
var
cycle:
Number
=
0
;
private
var
offset:
Number
=- Math.PI/
2
;
//小腿的运动看上去应该滞后于大腿,所以需要加入反向偏移量
public
function
Walking4() {
init();
}
private
function
init():
void
{
segment0=
new
Segment(
100
,
35
);
//第一条大腿
addChild(segment0);
segment0.x=
200
;
segment0.y=
50
;
segment1=
new
Segment(
100
,
20
);
addChild(segment1);
segment1.x=segment0.getPin().x;
//第一条小腿连接到第一条大腿
segment1.y=segment0.getPin().y;
segment2=
new
Segment(
100
,
35
);
//第二条大腿
segment2.x = segment0.x;
//第二条大腿与第一条大腿坐标相同,视觉效果上看,就象都固定在腰部
segment2.y = segment0.y;
addChild(segment2);
segment3=
new
Segment(
100
,
20
);
addChild(segment3);
segment3.x=segment2.getPin().x;
//第二条小腿连接到第二条大腿
segment3.y=segment2.getPin().y;
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
}
private
function
EnterFrameHandler(event:Event):
void
{
walk(segment0, segment1, cycle);
walk(segment2, segment3, cycle + Math.PI);
//注意这里的:+Math.PI,如果不加这个,二条腿的频率/角度完全相同,将重叠在一起,加上180度以后,正好反相过来,一条腿在前,另一条腿在后
cycle += .
05
;
}
//把"走"的动作封装起来
private
function
walk(segA:Segment, segB:Segment, cyc:
Number
):
void
{
var
angleA:
Number
=Math.sin(cyc)*
45
+
90
;
var
angleB:
Number
=Math.sin(cyc+offset)*
45
+
45
;
segA.rotation=angleA;
segB.rotation=segA.rotation+angleB;
segB.x=segA.getPin().x;
segB.y=segA.getPin().y;
}
}
}
加入滑块控制条后的样子:
package
{
import
flash.display.Sprite;
import
flash.events.Event;
public
class
Walking5
extends
Sprite {
private
var
segment0:Segment;
private
var
segment1:Segment;
private
var
segment2:Segment;
private
var
segment3:Segment;
private
var
speedSlider:SimpleSlider;
private
var
thighRangeSlider:SimpleSlider;
private
var
thighBaseSlider:SimpleSlider;
private
var
calfRangeSlider:SimpleSlider;
private
var
calfOffsetSlider:SimpleSlider;
private
var
cycle:
Number
=
0
;
public
function
Walking5() {
init();
}
private
function
init():
void
{
segment0=
new
Segment(
100
,
30
);
addChild(segment0);
segment0.x=
200
;
segment0.y=
100
;
segment1=
new
Segment(
100
,
20
);
addChild(segment1);
segment1.x=segment0.getPin().x;
segment1.y=segment0.getPin().y;
segment2=
new
Segment(
100
,
30
);
addChild(segment2);
segment2.x=
200
;
segment2.y=
100
;
segment3=
new
Segment(
100
,
20
);
addChild(segment3);
segment3.x=segment2.getPin().x;
segment3.y=segment2.getPin().y;
//控制速度的滑块
speedSlider=
new
SimpleSlider(
0
,
0.5
,
0.11
);
addChild(speedSlider);
speedSlider.x=
10
;
speedSlider.y=
10
;
//控制大腿能分开的最大角度
thighRangeSlider=
new
SimpleSlider(
0
,
90
,
45
);
addChild(thighRangeSlider);
thighRangeSlider.x=
30
;
thighRangeSlider.y=
10
;
//大腿旋转的偏移量
thighBaseSlider=
new
SimpleSlider(
0
,
180
,
90
);
addChild(thighBaseSlider);
thighBaseSlider.x=
50
;
thighBaseSlider.y=
10
;
//小腿旋转的偏移量
calfRangeSlider=
new
SimpleSlider(
0
,
90
,
45
);
addChild(calfRangeSlider);
calfRangeSlider.x=
70
;
calfRangeSlider.y=
10
;
//小腿相对大腿滞后的偏移量
calfOffsetSlider=
new
SimpleSlider(-
3.14
,
3.14
,-
1.57
);
addChild(calfOffsetSlider);
calfOffsetSlider.x=
90
;
calfOffsetSlider.y=
10
;
addEventListener(Event.ENTER_FRAME, EnterFrameHandler);
}
private
function
EnterFrameHandler(e:Event):
void
{
walk(segment0, segment1, cycle);
walk(segment2, segment3, cycle + Math.PI);
cycle+=speedSlider.value;
}
private
function
walk(segA:Segment, segB:Segment,cyc:
Number
):
void
{
var
angleA:
Number
= Math.sin(cyc) * thighRangeSlider.value + thighBaseSlider.value;
var
angleB:
Number
= Math.sin(cyc +calfOffsetSlider.value) * calfRangeSlider.value + calfRangeSlider.value;
segA.rotation=angleA;
segB.rotation=segA.rotation+angleB;
segB.x=segA.getPin().x;
segB.y=segA.getPin().y;
}
}
}
真正的行走:
发表评论
-
Flash/Flex学习笔记(50):矩阵变换
2011-04-24 13:52 1137先回顾一下Silvelright中的矩阵变换[转]WPF中的M ... -
Flash/Flex学习笔记(49):背面剔除与 3D 灯光
2011-04-24 13:50 957今天继续:上一回Flash/Flex学习笔记(50):3D线条 ... -
Flash/Flex学习笔记(48):迷你滚动条ScrollBar
2011-04-24 13:46 1035先看最终效果: 整个swf最终不到4k, ... -
Flash/Flex学习笔记(47):利用FMS快速创建一个文本聊天室
2011-04-24 13:45 960先来看客户端fla的构成: 第一帧:登录界面 第一帧的 ... -
Flash/Flex学习笔记(46):使用TweenLite
2011-04-24 13:43 1648TweenLite是第三方出品的专用于各种缓动动画的类库,其性 ... -
Flash/Flex学习笔记(45):3维旋转与透视变换(PerspectiveProjection)
2011-04-24 13:41 1182Flash/Flex学习笔记:3D基础 里已经介绍了3D透 ... -
Flash/Flex学习笔记(44):3D线条与填充
2011-04-24 13:39 10733D线条:把上一篇中的3D坐标旋转示例稍做修改,用线把各个 ... -
Flash/Flex学习笔记(43):3D基础
2011-04-24 13:34 1113之前我们所做的动画都 ... -
Flash/Flex学习笔记(42):反向运动学(下)
2011-04-24 13:30 897先要复习一下三角函数与余弦定理: 对于直角三角形,三边长 ... -
Flash/Flex学习笔记(41):反向运动学(上)
2011-04-24 13:29 914先回顾上篇所说的"正向运动学":以人行 ... -
Flash/Flex学习笔记(39):万有引力与粒子系统
2011-04-24 13:26 704万有引用公式: 其中G为万有引力常数 var numP ... -
Flash/Flex学习笔记(38):动量守恒与能量守恒
2011-04-24 13:24 914动能公式: 动量公式: 动量守恒: 能量守恒: ... -
Flash/Flex学习笔记(37):坐标旋转
2011-04-24 13:23 995坐标旋转是个啥概念呢? 如上图,(蓝色)小球 绕某一 ... -
Flash/Flex学习笔记(36):碰撞检测
2011-04-24 13:22 584碰撞检测基本上可能分为二类:对象与对象的碰撞检测、对象与点 ... -
Flash/Flex学习笔记(35):弹性运动续--弹簧
2011-04-24 13:21 734上一篇里演示的弹性运动加上摩擦力因素后,物体最终基本上都会比较 ... -
Flash/Flex学习笔记(34):弹性运动
2011-04-24 13:20 746动画中的弹性运动 从视觉效果上接近 物理经典力学中的单摆运 ... -
Flash/Flex学习笔记(33):缓动动画
2011-04-24 13:18 973缓动 与 匀变速 看上去很类似,但其实有区别: 匀变速的 ... -
Flash/Flex学习笔记(32):不用系统组件(纯AS3)的视频播放器--只有8.82K
2011-04-24 13:17 1244以前为了赶项目,利用系统组件制作过一款视频播放器(见Fla ... -
Flash/Flex学习笔记(31):自己动手实现一个滑块控件(JimmySilder)
2011-04-24 13:15 938先看最终的演示: 滑块条的应用实在太广泛了:mp3播放器中声 ... -
Flash/Flex学习笔记(30):如何正确监听Stage对象的事件
2011-04-24 13:13 1265如果想在一个自定义类中注册对stage对象的监听事件,然后在另 ...
相关推荐
附件是关于 Flash/Flex 几个重要框架 Cairngorm、Mate、PureMVC以及Swiz 的典型例子,由 Tony Hillerson 提供 Homepage: http://insideria.com
flex/Flash开发系列书籍:基于FLASH的WEB3D应用研究
Flex学习笔记Flex学习笔记Flex学习笔记Flex学习笔记Flex学习笔记
flash/flex画曲线,绘图板,用代码实现的个画曲线功能,类绘图板,可下载看看,不错的学习案例。
语言:C ++许可证:BSD-3代码质量:A + https://lgtm.com/projects/g/Genivia/RE-flex/context:cpp文档:https://www.genivia.com/doc/reflex/html /index.html存储库:https://github.com/Genivia/RE-flex更改日志...
flash/flex 的aqua皮肤.类似苹果系统
这是作者自己亲自编写的教程,里面包含的有图解教程,各式jar,及配置文件,全部包含在内,如果你是一个决定学习flex初学者,我敢保证它肯定适合你!带上你走上flex开发旅途!
FDT-flash/flex devtoolkit for eclipse. for最新版的 FDT 3.5 beta2
来自《潮汕IT男》网站的文章《解决flash/flex/as3 访问中文域名时的流错误》代码示例,地址:http://chenlinsheng.com/?p=990
NULL 博文链接:https://summerbell.iteye.com/blog/359226
flex学习笔记 flex学习笔记 flex学习笔记 flex学习笔记 flex学习笔记 flex学习笔记
第一阶段(2周左右每天至少4个小时):入门 目标是:做简单的demo....参考书:Flex 入门教程http://www.5uflash.com/Flex-AIR/Flexziliao/17.html flex入门介绍:http://download.csdn.net/source/452847
最近开始学习Flex,其中用到了AS,AS2到AS3发生了很大的变化,完全的面向对象,知道这个特点以后我也一直没有特意的好好去学学AS3,但是随着最近学习的深入,还是有必要学习一下
总共有4个例子: 1.http://127.0.0.1:8080/flexDemo/HelloWorld/HelloWorld.html ...如果你的数据库配置和我的不一样,请修改flexDemo\WEB-INF\classes\下的DBSetting.properties文件,数据库建表的sql语句是user.sql
一.flex2的全屏代码 在仅仅使用Flex Builder2(我下载的是FLXB_2.0_Win_WWE.exe)的时候,写全屏代码竟然找不到flash.display.StageDisplayState,于是下载了Flex 2.0.1升级包(官方地址:...(参考:...
NULL 博文链接:https://as3.iteye.com/blog/1134453
本人用FLEX写的直播播放器,基于RTMP协议。代码要放入tomcat等容器里运行,打开play.html即可看到例子效果,含有源代码,希望能帮助到需要的人。
xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="app_creationCompleteHandler(event)"> <fx:Script> <![CDATA[ import mx.events.FlexEvent; ...
Flex学习笔记1
终极破解方法,超级好用,100%成功,亲测,请大家使用。(会弹出个小框提示配置错误,但点击确定即可使用,没有任何影响)