SIHOのプログラミングわーくワク

興味の赴くままに勉強してたら、読み書きできる言語は9個になりました。他にもいくつか気になる言語があったりなかったり?  まだまだ続く、楽しいお仕事わーくワク♪

  • « 
  • 10 
  • 11 
  • 12 
  • 13 
  • 14 
  • 15 
  • 16 
  • 17 
  • 18 
  • 19 
  • 20 
  • 21 
  • 22 
  • 23 
  • 24 
  • 25 
  • 26 
  • 27 
  • 28 
  • 29 
  • 30 
  • »

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Sceneの中のオブジェクトにフィルターを適用したい

2009.11.24 (Tue)

3DのSceneにオブジェクトを表示できるようになりました。
自動でカメラが動くようにしているので、オブジェクトにつけられるアニメーションには制約ができます。
そこで、Sceneの中でオブジェクトをZ軸方向に45度傾けてひし形にして横方向に回転させようかな?とか思案しました。
やってみたところ、これが斜めに動いちゃうんですね。
bug

@clockmaker_core さんに教えてもらった方法で、直しました!

きちんとひし形のまま横に回転しています。わーい♪
bitmap
・swf(1280*768)
・sample

なのですが、フィルターが思ったようにかからないです。
普通にFlashで設定するときと同じ方法で試したのですが、どうもそれだとだめみたい。
それに、ダウンのときのfunctionが反応しないっす。これはなぜだー!!
■Flash側(基本、呼んでいるだけ)

var seaMapNum:uint=1;

var world:World=new World(this,seaMapNum);

this.addChildAt(world,0);

start.addEventListener(MouseEvent.CLICK , enterFrameStart);

function enterFrameStart(event:MouseEvent):void {
start.visible= false;
world.addEventListener(Event.ENTER_FRAME, world.enterFrameHandler);
this.addEventListener(Event.MOUSE_LEAVE, world.mouseReave);
start.removeEventListener(MouseEvent.CLICK , enterFrameStart);
}



■World.as側

package
{
import adobe.utils.CustomActions;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.MovieClip;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.BlurFilter;
import flash.filters.GlowFilter;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.ui.*;
import flash.net.*;
import flash.text.AntiAliasType;
import flash.text.GridFitType;

// Papervision3Dライブラリを読み込み
import org.papervision3d.cameras.*;
import org.papervision3d.materials.special.CompositeMaterial
import org.papervision3d.view.BasicView;
import org.papervision3d.materials.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.*;
import org.papervision3d.objects.*;
import org.papervision3d.view.*;
import org.papervision3d.view.layer.*;
import org.papervision3d.core.clipping.FrustumClipping;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.events.InteractiveScene3DEvent;

/**
* ...
* @author SIHO
*/
[SWF(frameRate = "60")]
public class World extends BasicView
{
//メソッドを送ったタイムライン保持する
public var main_mc:MovieClip;
public var grdWidth:uint;
public var grdHeight:uint;
public var seaMapNum:uint;
public var viewArea:String;
public var picCode:uint;
public var bioArray:Array;
private var containerObjArray:Array = new Array();
private var myMc:Loader = new Loader()
private var objArray:Array = new Array();

private var mousePivotX:Number;
private var mousePress:Boolean = false;
private var stepFoward:Boolean = true;//trueだと+方向へ進む
private var cnt:uint = 0;
private var layer:Plane;

private var myURL:String = "commons/images/";
private var loader:URLLoader;
private var xmlText:XMLList;
private var xmlLayer:XMLList;
private var tf:TextFormat = new TextFormat()
private var filter:GlowFilter = new GlowFilter();
private var bFilter:BlurFilter = new BlurFilter();

[Embed(source = '../assets/map.png')] private var MapImage:Class;

public function World(initObj:MovieClip, xNumber:uint )
{
super(1280, 768, true, false, CameraType.FREE);
main_mc = initObj;
seaMapNum = xNumber;
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onLoaded);
var xmlURL:String=myURL+"deepsea"+seaMapNum+".xml";
var urlReg:URLRequest=new URLRequest(xmlURL);
loader.load(urlReg);
}
/**読み込んだXMLからデータを取り出す**/
private function onLoaded(event:Event):void {
var xmlObj:XML=new XML(loader.data);
xmlText = xmlObj.xmldata;
xmlLayer = xmlObj.laydata;
grdWidth = xmlObj.map.w;
grdHeight = xmlObj.map.h;

setupScene();
}
/**シーンの設定**/
private function setupScene():void
{
renderer.clipping = new FrustumClipping(FrustumClipping.ALL);
startRendering();

viewport.buttonMode = true;
viewport.interactive = true;
camera.fov = 45;
camera.z = -(grdHeight/2-300);

var ground:Plane = new Plane( new BitmapMaterial((new MapImage()).bitmapData, true), grdWidth, grdHeight);
ground.y = -30;
ground.rotationX = 90;
scene.addChild( ground );

xInitData();
setupBioObject();
setEventListener();
setupBioNameObj();
}
/**SetEventListener**/
private function setEventListener():void {
main_mc.addEventListener( MouseEvent.MOUSE_DOWN, mouseDown );
main_mc.addEventListener( MouseEvent.MOUSE_UP, mouseUp);
}
/**クリックオブジェクトをワールドに生成**/
private function setupBioObject():void {
for (var i:uint = 0; i < xmlText.length(); i++) {
//配列をつくり、親のDisplayObject3Dを作成
containerObjArray[i]= new DisplayObject3D();
scene.addChild(containerObjArray[i]);
// 子のPlaneを作成
myMc = new Loader()
myMc.load(new URLRequest(myURL + xmlText[i].img1.toString()));
myMc.filters = [filter];
var objMaterial:MovieMaterial = new MovieMaterial(myMc, false, true, false, new Rectangle(-2, -2, 54, 54));
objMaterial.interactive = true;
objMaterial.oneSide = false;
objArray[i] = new Plane(objMaterial, 25, 25);
objArray[i].id = i;
objArray[i].name = xmlText[i].bioId;
objArray[i].rotationZ = 45;

// 親に子を追加
containerObjArray[i].addChild(objArray[i]);
//位置調整
containerObjArray[i].x = uint(xmlText[i].x) - (grdWidth / 2);
containerObjArray[i].z = uint(xmlText[i].y) - (grdHeight / 2);
if (xmlText[i].state.toString() == "down") containerObjArray[i].y = -5;
else containerObjArray[i].y = 45;
//Y軸回転をランダムにする。
containerObjArray[i].rotationY = Math.floor(Math.random()*180);

objArray[i].addEventListener(InteractiveScene3DEvent.OBJECT_OVER , xObjOver);
objArray[i].addEventListener(InteractiveScene3DEvent.OBJECT_OUT , xObjOut);
objArray[i].addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE_OUTSIDE , xObjOut);
objArray[i].addEventListener(InteractiveScene3DEvent.OBJECT_RELEASE , xObjOut);
objArray[i].addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, xObjClick);
}
}
/**ドラッグしているときのフラグ処理**/
private function mouseDown(event:MouseEvent):void
{ mousePivotX = mouseX;
mousePress = true; }
private function mouseUp(event:MouseEvent):void
{ mousePress = false; }
/** enterFrameHandler*/
public function enterFrameHandler( event:Event ):void
{
//trace("x:" + Math.round(camera.x), "z:" + camera.z);
for (var i:uint = 0; i < xmlText.length(); i++) {
// 親のY回転
containerObjArray[i].rotationY += 5;
}
updataCamera();

//Mouse.cursor = flash.ui.MouseCursor.HAND;
var speedX:Number;

if (mousePress == true) {
Mouse.cursor = flash.ui.MouseCursor.BUTTON;
if (Math.abs(camera.x) <= (grdWidth / 2) - 150) {
if (stepFoward) camera.x -= (mouseX - mousePivotX) / stage.stageWidth * 30;
else camera.x += (mouseX - mousePivotX) / stage.stageWidth * 30;
}else {
camera.x = (grdWidth / 2-150) * (camera.x / Math.abs(camera.x));
};
}
}
/** Render Method for Camera*/
override protected function onRenderTick(event:Event=null):void
{ renderer.renderScene(scene, camera, viewport); }
/**カメラを進めるかどうかの判断をしている*/
private function updataCamera():void {
if (Math.abs(camera.x) < 1) camera.x = 0;
else camera.x = Math.round(camera.x) - Math.round(camera.x * 0.2);
if (Math.abs(camera.z) > Math.round((grdHeight / 2) - 300)) setPorl();
else xfowardCamera();
}
/**世界の端でカメラが展開するときの前準備**/
private function setPorl() {
if (stepFoward ) {
stepFoward = false;
this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
this.addEventListener(Event.ENTER_FRAME, xCameraRotation);
}else {
stepFoward = true;
this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
cnt = 180;
this.addEventListener(Event.ENTER_FRAME, xCameraRotation);
}
}
/**世界の端でカメラが方向展開する**/
private function xCameraRotation(event:Event):void {
if (stepFoward) {
cnt -= 10;
camera.rotationY = cnt;
if (cnt < 10) {
cnt = 0
rotationY = cnt;
camera.z = -Math.round((grdHeight / 2) - 300)
camera.x = 0;
this.removeEventListener(Event.ENTER_FRAME, xCameraRotation);
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
}else {
cnt += 10;
camera.rotationY = cnt;
if (cnt > 170) {
cnt = 180;
rotationY = cnt;
camera.z = Math.round((grdHeight / 2) - 300)
camera.x = 0;
this.removeEventListener(Event.ENTER_FRAME, xCameraRotation);
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
cnt = 0;
rotationY = 0;
}
}
}
/**カメラを進めますよ**/
private function xfowardCamera():void {
if (stepFoward) camera.moveForward(3);
else camera.moveForward(3);
}
/**オブジェクトにマウスが重なったときの処理**/
public function xObjOver(event:InteractiveScene3DEvent):void
{
this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
var targetObj:DisplayObject3D = event.displayObject3D;
targetObj.scaleX = 1.5;
targetObj.scaleY = 1.5;
myMc.filters = [bFilter];
addChildAt(bioArray[targetObj.id],1)
bioArray[targetObj.id].x = mouseX+10;
bioArray[targetObj.id].y = mouseY+10;
}
/**オブジェクトからマウスが外れたときの処理**/
public function xObjOut(event:InteractiveScene3DEvent):void
{
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
var targetObj:DisplayObject3D = event.displayObject3D;
targetObj.scaleX = 1;
targetObj.scaleY = 1;
removeChild(bioArray[targetObj.id])
}
/**オブジェクトがクリックされたときの処理**/
public function xObjClick(event:InteractiveScene3DEvent):void
{
this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
var targetObj:DisplayObject3D = event.displayObject3D;
targetObj.alpha=0.5;
targetObj.scaleX = 1;
targetObj.scaleY = 1;
removeChild(bioArray[targetObj.id])
}
/**マウスがステージから外れたときの処理**/
public function mouseReave(event:Event):void
{ this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
main_mc.clickArea.addEventListener(MouseEvent.MOUSE_OVER, mouseback);
}
/**マウスがステージに戻ってきたときの処理**/
public function mouseback(event:Event):void
{ this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
/**テキストのセット**/
private function setupBioNameObj():void {
bioArray= new Array()
//テキストのfontを指定
//tf.font="fontを引き渡す";
tf.font = "MSMINCHO";
for (var i:uint = 0; i < xmlText.length(); i++) {

bioArray[i] = new TextField();
bioArray[i].defaultTextFormat=tf;
bioArray[i].selectable=false;
bioArray[i].autoSize =TextFieldAutoSize.LEFT;
//bioArray[i].embedFonts=true;
bioArray[i].background=true;
bioArray[i].backgroundColor=0x1D1F20;
bioArray[i].border=true;
bioArray[i].borderColor=0x889B9E;
bioArray[i].antiAliasType=AntiAliasType.ADVANCED;
bioArray[i].gridFitType=GridFitType.PIXEL;
bioArray[i].sharpness = 100;
bioArray[i].setTextFormat(tf);
bioArray[i].text = xmlText[i].bioname.toString();
}
}
/**各種設定**/
private function xInitData():void {
//テキストフォーマットの設定
tf.align="left";
tf.size=12;
tf.leading=2;
tf.leftMargin=5;
tf.rightMargin=5;
tf.kerning=true;
tf.color = 0xffffff;

//up_グローフィルターの設定
filter.color=0xe96e9b;
filter.blurX=4;
filter.blurY = 4;
filter.alpha = .8;

//ブラーフィルターの設定
bFilter.blurX=5;
bFilter.blurY=1;
}
}
}

コメント

コメントの投稿

トラックバック

この記事のトラックバックURL

 | HOME | 

プロフィール

siho_prof

SIHO
しほ

Twitter:
SIHO_o

viva mambo, inc.
iPhone&iPad / Flash / Kinect
使用言語:Objective-C, ActionScript 3.0, Javascript, Lua, PHP, C#, C, C++, WSH。
F-site staff

Solar System Simulator 広報

Web,スマートフォン、Desktopを問わず、アプリ制作が好物。執筆は必要に応じて。お仕事くださいまし。

サイネージ:ガンダムフロント東京・キャラクターフォトスポット設計(2012/4~常設)

アトラクション:富士急ハイランド 戦国BASARA ゲーム設計&プログラミング(2010/7-2012/4にて常設展示)

イントラシステム:「某メーカー研究所KJ法システム」DB,Flash,PHPを含むソリューション設計&DB構築、「美術系専門学校の生徒管理システム」iPadクライアントを含むソリューション設計&DB構築

iPhone/iPadアプリ:某球団試合速報アプリ、『魂を熱くさせる 宇宙飛行士100の言葉』『Mitaka Gallery -てのひら宇宙-』

書籍同梱ソフト:『4次元デジタル宇宙紀行Mitaka』『DVD-ROM&図解 動く! 深海生物図鑑』『DVD-ROM&図解 ハッブル望遠鏡で見る宇宙の驚異』

著書:『世界一わかりやすい Windows 7』『世界一わかりやすい Flash CS3』

検索フォーム

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。