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

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

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

スポンサーサイト

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

ドラッグ操作で3Dのsceneをぐりぐりしたい

2009.11.20 (Fri)

PV3Dのお勉強を始めました。
もちろん、実案件で必要だからなのですが、まず奥行きのある世界をドラッグ操作でぐりぐりしたいので、作ってみました。画像が無意味に大きいのですが、実案件の設定のままなので許してくださいまし。
作り直せばよいのだけども、その暇が無いし、暇ができるまで待っていると、経緯を忘れそうなのでいまのままメモしておきます。(とか言い訳w)

pv3dDrag
・swf(1280*768)
・sample Flashのタイムラインで作成しているけど、PV3Dの部分はクラスファイルで作りました。
クラスファイルだと、別のクラスファイルを継承して拡張する機能があったり、「super()」で継承元の基本設定を読み込める(つまり再設定不要)ので、Flash内のActionScriptパネルで書くよりコードが短くてすみます。
なので、クラスファイルは使い慣れないけども、がんばって使ってみています。なので、書き方はかなり怪しいので、通りすがりのかたの添削はウェルカムです!
(※スクリプターさんたちが、コードを行番号つきとかで見やすく表示しているけども、あれってどうやるんだろー?)

■Flash側

var mapWidth:uint = 2500;
var mapHeight:uint = 1500;

var world:World=new World(this,mapWidth,mapHeight);

this.addChildAt(world,0);

start.addEventListener(MouseEvent.CLICK , enterFrameStart);

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



■World.as側

package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.ui.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.materials.special.CompositeMaterial;

// Papervision3Dライブラリを読み込み
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 = "30")]
public class World extends BasicView
{
//メソッドを送ったタイムライン保持する
public var main_mc:MovieClip;
public var grdWidth:uint;
public var grdHeight:uint;
private var airShip:Sphere;

private var mousePivotX:Number;
private var mousePivotY:Number;
private var mousePress:Boolean = false;

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

public function World(initObj:MovieClip,mapWidth:uint,mapHeight:uint)
{
main_mc = initObj;
grdWidth = mapWidth;
grdHeight = mapHeight;
super();
main_mc.addEventListener( MouseEvent.MOUSE_DOWN, mouseDown );
main_mc.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
main_mc.stage.addEventListener(Event.MOUSE_LEAVE, mouseReave);

camera.fov = 45;//カメラの視野
viewport.buttonMode = true;
viewport.interactive = true;

setupScene();
startRendering();

}

private function setupScene():void
{
renderer.clipping = new FrustumClipping(FrustumClipping.BOTTOM);

//camera.y= 20;
camera.z = -600;
camera.zoom = 30;
camera.focus = 30;

var objMaterials:ColorMaterial = new ColorMaterial(0xFFFFFF)
objMaterials.interactive = true;
airShip = new Sphere(objMaterials , 2, 1, 1);
//airShip.y = 10;
airShip.z = -500;
scene.addChild(airShip);
airShip.addEventListener(InteractiveScene3DEvent.OBJECT_OVER , xObjOver);
airShip.addEventListener(InteractiveScene3DEvent.OBJECT_OUT , xObjOut);

var ground:Plane = new Plane( new BitmapMaterial((new MapImage()).bitmapData, true), grdWidth, grdHeight);

ground.y = -30;
ground.rotationX = 90;
scene.addChild( ground );
}

private function mouseDown(event:MouseEvent):void
{
mousePivotX = mouseX;
mousePivotY = mouseY;
//trace(mousePivotX, mousePivotY);
mousePress = true;
}
private function mouseUp(event:MouseEvent):void
{
mousePress = false;
}

public function enterFrameHandler( event:Event ):void
{
Mouse.cursor = flash.ui.MouseCursor.HAND;
var speedX:Number;
var speedZ:Number;

/*if (mousePress == true) {
trace(mousePress);
camera.x += (mouseX - mousePivotX) / stage.stageWidth * 10;
camera.z += (mouseY - mousePivotY) / stage.stageHeight * 10;
}*/
//マウスのインタラクティブ・慣性ありのほう
if (mousePress == true) {
Mouse.cursor = flash.ui.MouseCursor.BUTTON;
if (Math.abs(camera.x) <= (grdWidth / 2)-50) {
speedX = -(mouseX - mousePivotX) / stage.stageWidth * 30;
camera.x += speedX;
speedX = speedX * 0.1;
}else {
camera.x = ((grdWidth / 2)-50) * (camera.x / Math.abs(camera.x));
};
if (Math.abs(camera.z) <= (grdHeight / 2)-50) {
speedZ = -(mouseY - mousePivotY) / stage.stageHeight * 30;
camera.z += speedZ;
speedZ = speedZ * 0.1;
}else {
camera.z = ((grdHeight / 2)-50) * (camera.z / Math.abs(camera.z));
};
}
}
/**
* Render Method for Camera
*/
override protected function onRenderTick(event:Event=null):void
{
renderer.renderScene(scene, camera, viewport);
}

public function xObjOver(event:InteractiveScene3DEvent):void
{
this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
var targetObj:DisplayObject3D = event.displayObject3D;
targetObj.scaleX = 2;
targetObj.scaleY = 2;
}
public function xObjOut(event:InteractiveScene3DEvent):void
{
this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
var targetObj:DisplayObject3D = event.displayObject3D;
targetObj.scaleX = 1;
targetObj.scaleY = 1;
}
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);
}
}
}

コメント

コメントの投稿

トラックバック

この記事のトラックバック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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。