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.21 (Sat)

前の記事で、ClockMakerのYasuさんにコメントいただいた「フリーカメラ」とやらを試してみる。
結果、原因不明だったたびたびの停止もなくなり、動きも滑らかになったように感じた。

書き直しも、カメラのターゲットに指定してたオブジェクトを片っ端からトルでOKなので、楽チンでした。
エリアの端まで来たら、rotationYで方向転換しているのだけども、rotationYって今見ている方向から「00度動く」という指定であって、ワールドの中で固定でもっている角度ではないのね。
「180度展開しますよー」って動かした後は「0」に戻しておかないとだめだった。
そのまま「180」に指定したままだとあらぬ方向を向いちゃうから、そうなんかなーと想像。
でも、また再び方向転換するときは、「180」にセットしなおしてから、「0」に向けてじょじょに減らしながら展開しないと、滑らかに回らないのだ。
その辺しっくりこないな。どんな仕様なんだろか?

freeCamera
・swf(1280*768)
・sample
■Flash側

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

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

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 flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.ui.*;

// 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;

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

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

public function World(initObj:MovieClip,mapWidth:uint,mapHeight:uint)
{
super(1280, 768, true, false, CameraType.FREE);
main_mc = initObj;
grdWidth = mapWidth;
grdHeight = mapHeight;
main_mc.addEventListener( MouseEvent.MOUSE_DOWN, mouseDown );
main_mc.addEventListener(MouseEvent.MOUSE_UP, mouseUp);

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

setupScene();
startRendering();
}

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

camera.z = -(grdHeight/2-300);
camera.y = 10

var objMaterials:ColorMaterial = new ColorMaterial(0xFFFFFF)
objMaterials.interactive = true;
objMaterials.fillAlpha = 0;

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;
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,"Y回転:"+camera.rotationY);
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 * 150;
else camera.x += (mouseX - mousePivotX) / stage.stageWidth * 150;
}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 = 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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。