おいしいAS3 -35ページ目

放射ビルドアニメ生成

最後に猫の手に追加したJSFLです

フラッシュアニメ作ってた時は
こういう感じのビルドアニメは
普通のビルドのJSFLを組み合わせて
なんとかしてたんですが
そのとき相当手間だったので
もう作ってしまいました

1フレームしかない状態のレイヤーの
複数のアイテムを選択した状態で使います

複数フレームあったり途中のフレームだったりすると
ちゃんと動いてくれません

猫の手のJSFLはそれぞれに特定の状態で
使われることしか想定してないので
基本けっこうわがままです




var orgX=prompt("中心X",0)
var orgY=prompt("中心Y",0)
var spd=prompt("速度",30)


function radialBuild(){

init()

var org={x:orgX,y:orgY}
var cnt=0
var frg=true


while(frg){
frg=false
dom.clipCut()
tml.insertKeyframe(tml.currentFrame+1)
frm=lyr.frames[tml.currentFrame]
dom.clipPaste(true)
for each(var ele in frm.elements){
if(getDst(ele,org)<cnt*spd){
ele.selected=false
}else{
frg=true
}
}
cnt++
}

}

function init(){
dom=fl.getDocumentDOM()
sel=dom.selection
tml=dom.getTimeline()
lyr=tml.layers[tml.currentLayer]
frm=tml.layers[tml.currentLayer].frames[tml.currentFrame]
}

function getDst(pos1,pos2){
return Math.sqrt((pos1.x-pos2.x)*(pos1.x-pos2.x)+(pos1.y-pos2.y)*(pos1.y-pos2.y))
}

猫重いよ・・・

おいしいAS3


ActionScriptなら余裕でリアルタイムで動いてくれるようなものでも
JSFLだと『15秒もかかってんだけど、止める?』とかいわれてしまう

それだけならいいけど、時として止まる

猫の手(オリジナルのJSFL群の名前です)は
やはり猫の手程度にとどめておいた方がいいか・・・


ちょいと猫の手の機能フル活用してPVみたいなもんでも作ってみます

あと一個だけ追加したい機能があるのでそれだけ終わったら作ってみます

PaperVision3Dでルービックキューブ(続)



回転軸がどっち向いてるのか
調べたりとかしようとしたけど
もうクオータニオンとかはワケわからんので
キューブの頂点共に移動していただきました

これで常にDisplayObjectContainer3Dは
通常は回転してない状態にできるので
一体いまこのオブジェクトはどっち向いてるのか
とか考えなくて済みます

ちょっとコードを短くしたいのを優先しちゃって
無駄な計算させてるとこありますが
一応もくろみ通りの動きはしてくれてます





import com.greensock.TweenMax

//──────────────▼編集部分▼───────
function makeObj():DisplayObject3D {
var rubic:DisplayObject3D=new DisplayObject3D()
var cubeList:Array=new Array()
var R=0xFF0000
var G=0x00FF00
var B=0x0000FF
var C=0x00FFFF
var M=0xFF00FF
var Y=0xFFFF00
var g=0x333333
var mtrObj=new Object()
mtrObj.top=new ColorMaterial(R|g)
mtrObj.left=new ColorMaterial(G|g);
mtrObj.right=new ColorMaterial(B|g);
mtrObj.front=new ColorMaterial(C|g);
mtrObj.back=new ColorMaterial(M|g);
mtrObj.bottom=new ColorMaterial(Y|g);
var mtrLst=new MaterialsList(mtrObj)
rubic.y=150
for(i=0;i<27;i++){
cubeList.unshift(new Cube(mtrLst,45,45,45))
with(rubic.addChild(new DisplayObject3D()).addChild(cubeList[0])){
x=(i%3)*50-50
y=Math.floor(i/9)*50-50
z=(Math.floor(i/3)%3)*50-50
}
}
for(var i=0;i<72;i++){
setTimeout(rotCubeRow,500*i+1000,["x","y","z"][i%3],i%3-1,(i%2)*2-1)
}
function rotCubeRow(pol,row,rol){
var task=new Object()
task["rotation"+["X","Y","Z"][["x","y","z"].indexOf(pol)]]=rol*90
for each(var cb in cubeList){
var pos=cb.position
var rotX=cb.parent.rotationX
var rotY=cb.parent.rotationY
var rotZ=cb.parent.rotationZ
with(pos){
rotateX(rotX)
rotateY(rotY)
rotateZ(rotZ)
}
cb.position=pos
rotObject(cb,"X",rotX)
rotObject(cb,"Y",rotY)
rotObject(cb,"Z",rotZ)
cb.parent.rotationX=cb.parent.rotationY=cb.parent.rotationZ=0
if(Math.abs(cb[pol]-50*row)<30)TweenMax.to(cb.parent,0.4,task)
}
function rotObject(obj,pol,ang){
for each(var vrt in obj.geometry.vertices){
var pnt=vrt.getPosition()
pnt["rotate"+pol](ang)
vrt.x=pnt.x
vrt.y=pnt.y
vrt.z=pnt.z
}
}
}
return rubic
}

//──────────────▲編集部分▲───────


import org.papervision3d.view.BasicView;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.*;
import org.papervision3d.materials.special.*;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.core.effects.view.*;
import org.papervision3d.core.geom.*;
import org.papervision3d.core.math.*;
import com.greensock.TweenLite;
import com.greensock.easing.*;

//view
var refVwr=new ReflectionView;
//light
var light=new PointLight3D();
//materials
var imgMtr=new BitmapFileMaterial("FS125_L.jpg",true)
var fltMtr=new FlatShadeMaterial(light,0xAAFFAA,0x448844);
var grdMtr=new GouraudMaterial(light,0xAAFFAA,0x448844);
var envMtr=new EnvMapMaterial(light,new BitmapData(400,400),new BitmapData(400,400),0x448844);
var lineMtr=new LineMaterial();
//materialList
var mtrLst=new MaterialsList({all:fltMtr})
//...etc
var drc=0;
var dst=500;
var rot=0;
var fly=0;
var prevX=mouseX;
var prevY=mouseY;

//viewセッティング
addChild(refVwr);
refVwr.surfaceHeight=0;
refVwr.viewportReflection.filters=[new BlurFilter()];
refVwr.setReflectionColor(0.8,0.8,0.8,100,100,100);

//objectセッティング

refVwr.scene.addChild(makeObj());

//フレームイベント
addEventListener(Event.ENTER_FRAME,frameTick);
function frameTick(e) {
drc+=rot;
rot*=0.98;
fly*=0.98;
refVwr.camera.x=light.z=Math.cos(drc)*dst;
refVwr.camera.z=light.x=Math.sin(drc)*dst;
refVwr.camera.y=light.y=Math.min(Math.max(refVwr.camera.y+fly,1),1000);
refVwr.singleRender();
}
//マウス操作
stage.addEventListener(MouseEvent.MOUSE_DOWN,function(e){prevX=mouseX;prevY=mouseY;stage.addEventListener(Event.ENTER_FRAME,setRot)});
stage.addEventListener(MouseEvent.MOUSE_UP,function(e){stage.removeEventListener(Event.ENTER_FRAME,setRot)});
function setRot(e) {
rot=(prevX-mouseX)/300;
fly=mouseY-prevY;
prevX=mouseX;
prevY=mouseY;
}





このコードを動かすには
TweenMaxとPaperVision3Dが必要です

PaperVision3Dで実験的に
いろいろオブジェクトをつくって
くるくる回してみるためのコードの上に書いてるので
いろいろ要らないものも入ってます