2009年11月29日日曜日

メモです。

ソーシャルブックマークでも使えって突っ込みは無しの方向で・・・

『龍が如く4 伝説を継ぐもの』は神室町がより立体的でリアルに
いいぞもっとやれ。こういう街を歩けるゲームって好きだったりします。
シェンムーとかアサクリとか。RPGは新しい街に行くのが楽しい。

「潮風の消える海に」舞台探訪
おーすごい。ついホームから飛び降りたくなる。実在する舞台があったんですね。
自分もたまに自転車でふらーっと出かけますが、こんな風に目的を持って出かけるのもいいかもしれない。

「fonthack.jp | フリーで使える日本語フォント」に使われている日本語フリーフォントをまとめてみた(漢字も使える)

[CSS]スタイルシートで実装する、アイデア溢れる画像ギャラリー
いつものことながらCSSplayはすごいなあ。

【86枚】PSPの壁紙ください
PSPは面倒なので壁紙使ってないですがメモ。

Valveってどんな所だろう?素敵なオフィス写真が公開、バールのような物が凄い!
ちょっと気持ち悪い。360でOrange Box一通りやりましたが、変な生物みたいなの気持ち悪い。ああいうの苦手。

[Flex]Buttonのiconを動的に変える

ダウンロードして使えるボタン素材いろいろ
一風変わったボタンも即席で作れてしまうボタン作成素材集
ボタン。

高品質なテクスチャをダウンロード&登録できるサイト -Textur.es
テクスチャ。

Fichier:Medico peste.jpg
以前NHKの世界ふれあい街歩きのエディンバラ(多分)で見たんだけど、ペストの医者らしい。名前は忘れた。
なんかシャイニングフォース3の敵教団ザコっぽいのでメモ。

そういえばXPとかで「¥」を連続で押すと半角に変わる理由、知ってる人いたら教えてください。

2009年11月23日月曜日

[Away3D]UV座標とれた。

最近投稿のタイトルが適当です。

にわからないって言ってたUV座標の取り方がわかりました。
わからないって言ってたのが馬鹿みたいに簡単にできました。

こんなん。
そういえばちょっと前から作ったものをGoogle App Engineのほうに上げるようにしたんですけど問題なく見られますかね?あまり動作確認とかしてないので・・・

ソースコードはこんな感じ。
package {
 import away3d.cameras.HoverCamera3D;
 import away3d.containers.ObjectContainer3D;
 import away3d.containers.Scene3D;
 import away3d.containers.View3D;
 import away3d.core.utils.Cast;
 import away3d.events.MouseEvent3D;
 import away3d.lights.DirectionalLight3D;
 import away3d.loaders.Collada;
 import away3d.materials.MovieMaterial;

 import flash.display.Bitmap;
 import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.display.StageQuality;
 import flash.events.Event;
 import flash.events.MouseEvent;

 public class away3 extends Sprite {
  private var scene:Scene3D;
  private var camera:HoverCamera3D;
  private var view:View3D;

  [Embed(source="mate.png")]
  public var materialImage:Class;
  [Embed(source="test.dae", mimeType="application/octet-stream")]
  public var colladaData:Class;

  private var material:MovieMaterial;
  private var collada:Collada;
  private var model:ObjectContainer3D;
  private var light:DirectionalLight3D;
  private var mc:MovieClip;

  private var isMouseDown:Boolean;
  //navigation variables
  private var lastPanAngle:Number;
  private var lastTiltAngle:Number;
  private var lastMouseX:Number;
  private var lastMouseY:Number;


  public function away3() {
   mc = new MovieClip();
   mc.base = mc.addChild(new Bitmap(Cast.bitmap(materialImage)));
   mc.surface = mc.addChild(new Sprite());
   initEngine();
   initLights();
   initMaterials();
   initObjects();
   initListeners();

   isMouseDown = false;
  }

  /**
   * Initialise the engine
   */
  private function initEngine():void {
   scene = new Scene3D();
   camera = new HoverCamera3D();
   camera.zoom = 1;
   camera.focus = 100;
   camera.distance = 50;
   camera.steps = 10;
   camera.targetpanangle = camera.panangle = 0;
   camera.targettiltangle = camera.tiltangle = 10;

   view = new View3D({camera: camera, scene: scene});
   addChild(view);

   stage.quality = StageQuality.HIGH;
  }

  /**
   * Initialise the lights
   */
  private function initLights():void {
   //light = new DirectionalLight3D({color:0xFFFFFF, ambient:0.25, diffuse:0.75, specular:0.9, x:40000, y:40000, z:40000});
   light = new DirectionalLight3D();
   light.color = 0xFFFFFF;
   light.ambient = 0.25;
   light.diffuse = 0.75;
   light.specular = 0.9;
   light.x = 0;
   light.y = 1000;
   light.z = 1000;

   scene.addChild(light);
  }

  /**
   * Initialise the materials
   */
  private function initMaterials():void {
   material = new MovieMaterial(mc);
   material.interactive = true;
  }

  /**
   * Initialise the scene objects
   */
  private function initObjects():void {
   //model1 = Collada.parse(Charmesh, {scaling:10, material:material, mouseEnabled:false});
   collada = new Collada();
   //collada.scaling = 0.1;
   model = collada.parse(colladaData) as ObjectContainer3D;
   model.materialLibrary.getMaterial("mat1").material = material;
   model.mouseEnabled = true;
   model.addOnMouseDown(onModelMouseDown);
   scene.addChild(model);
  }

  /**
   * Initialise the listeners
   */
  private function initListeners():void {
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
   stage.addEventListener(Event.RESIZE, onResize);
   stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
   stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
   stage.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);
   onResize();
  }

  /**
   * Navigation and render loop
   */
  private function onEnterFrame(event:Event):void {
   //update the camera position
   if(isMouseDown) {
    camera.targetpanangle = 0.35 * (stage.mouseX - lastMouseX) + lastPanAngle;
    camera.targettiltangle = 0.35 * (stage.mouseY - lastMouseY) + lastTiltAngle;
   }
   camera.hover();

   //render scene
   view.render();
  }

  private function onModelMouseDown(e:MouseEvent3D):void {
   mc.surface.graphics.beginFill(0xFFFFFF);
   mc.surface.graphics.drawCircle(e.uv.u * mc.width, mc.height - (e.uv.v * mc.height), 100);
   mc.surface.graphics.endFill();
  }

  private function onMouseDown(event:MouseEvent):void {
   lastPanAngle = camera.targetpanangle;
   lastTiltAngle = camera.targettiltangle;
   lastMouseX = stage.mouseX;
   lastMouseY = stage.mouseY;
   isMouseDown = true;
   stage.addEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
  }

  private function onMouseUp(event:MouseEvent):void {
   isMouseDown = false;
   stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
  }

  private function onMouseWheel(e:MouseEvent):void {
   camera.distance -= e.delta * 1.5;
   if(camera.distance < 0) {
    camera.distance = 0;
   } else if(camera.distance > 70) {
    camera.distance = 70;
   }
  }

  private function onStageMouseLeave(event:Event):void {
   isMouseDown = false;
   stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
  }

  /**
   * stage listener for resize events
   */
  private function onResize(event:Event = null):void {
   view.x = stage.stageWidth / 2;
   view.y = stage.stageHeight / 2;
  }
 }
}

UV座標は、
material = new MovieMaterial(mc);
material.interactive = true;
MovieMaterialを使ってinteractiveをtrueにして、
private function onModelMouseDown(e:MouseEvent3D):void {
 mc.surface.graphics.beginFill(0xFFFFFF);
 mc.surface.graphics.drawCircle(e.uv.u * mc.width, mc.height - (e.uv.v * mc.height), 100);
 mc.surface.graphics.endFill();
}
MouseEvent3Dのuvで取得できます。
Y座標は「e.uv.v * mc.height」かと思ったんですが、「mc.height - (e.uv.v * mc.height)」でした。
わかりづらいね。

参考サイト
blog.tartiflop » Blog Archive » First steps in Away3D : Part 3 - Texture mapping
Tutorials (category) > Tutorials > Flash Magazine

カメラの動きは相変わらずよくわからない。

2009年11月21日土曜日

[Away3D]ライトとか。

Away3DでCollada(DAE)オブジェクトにお絵かき、みたいなことをやろうとしたけどやり方がわからなかったので違うものを作ってみました。
Away3Dでクリックした座標をどうやってとってくるのかがよくわからないんだよなー。Pv3DだとVirtualMouseとか使ってたけどどうやるんだろ?

今回はライトの3つの値(ambient, diffuse, specular)をスライダーで変更してみました。
こちら。
いつものようにソースコードは右クリック→「ソースの表示」で見られます。
自分も大学のCG論のOpenGLで少しやったぐらいなのであまり詳しくないですが、ambientは環境光、diffuseは散乱光、specularは反射です。

次はまだよく理解していないカメラの動きを勉強する。

2009年11月11日水曜日

memo

メモです。いつもより多くメモしております。

Away3D関係
First steps in Away3D : Part 5 - Lighting and shading
Part1からソースコードが載ってるので勉強になります。
Flash 3D Basics
名前の通り3Dの基本です。英語のサイトですがサンプルがあってわかりやすい。
[Away3D] Collada Animation
アニメーションはやったことないですがとりあえずメモ。

ActionScript
配列コピー – ActionScript
slice()よりconcat()のほうが早いんですね。
そういえばこの間友達からArrayの初期化は「= new Array();」よりも「= [];」のほうが早いって聞きました。
FlexでObjectのvar_dump()を行う「Debug.dump」を試してみた
Objectの中身を表示してくれます。便利。

そうめん
ActionScript Thread Library 1.0 (そうめん) ドキュメント
そうめんです。非常に便利
そうめんをさわってみた その4
まだそうめん勉強中なので。
Thread(そうめん)× Away3D × Blenderで作成(僕がそうめんを使う理由的な)

jQuery, CSSとか
How To Create A Sexy Vertical Sliding Panel Using jQuery And CSS3
horinaja for scriptaculous or jQuery
[CSS]1ピクセルのラインを巧みに使用したドロップダウン型ナビゲーション


パッド派にとって格闘ゲームに最適なFightpad for Xbox 360
PCと360兼用として買おうかな。SSコンっぽいのでSSFでも使えそうだし。

2009年11月10日火曜日

[Away3D]Away3DでShader試してみた[AS3.0]

前回言ってた続きです。

Papervision3DでUVマッピングを使用したColladaがうまく読み込めなかったので、Away3Dで試してみました。
Away3Dは検索しても解説してくれているところがあまりないので、サンプルファイルを参考にしながら(というかコピーして)、UVマッピングを使用したColladaを表示してみました。
それでできたものがこれ

Pv3Dで表示されてた黒い線が消えてるじゃないですかー。
ぅわーい。

あ、Away3DはこちらにあるようにShaderの種類がPv3Dより少ないので、PhongShaderを使ったんですが、非常に重かったのでモデルデータを作り直しました。

というわけで全然完成してないけどソースコード公開するよ。
package {
 import away3d.cameras.HoverCamera3D;
 import away3d.containers.ObjectContainer3D;
 import away3d.containers.Scene3D;
 import away3d.containers.View3D;
 import away3d.core.base.Mesh;
 import away3d.core.utils.Cast;
 import away3d.lights.DirectionalLight3D;
 import away3d.loaders.Collada;
 import away3d.materials.PhongBitmapMaterial;
 
 import flash.display.Sprite;
 import flash.display.StageQuality;
 import flash.events.Event;
 import flash.events.MouseEvent;

 public class away3 extends Sprite {

  private var scene:Scene3D;
  private var camera:HoverCamera3D;
  private var view:View3D;

  //[Embed(source="mat.png")]
  //public var materialImage:Class;
  //[Embed(source="sample.dae", mimeType="application/octet-stream")]
  //public var colladaData:Class;
  [Embed(source="mate.png")]
  public var materialImage:Class;
  [Embed(source="test.dae", mimeType="application/octet-stream")]
  public var colladaData:Class;

  private var material:PhongBitmapMaterial;
  private var collada:Collada;
  private var model:ObjectContainer3D;
  private var mesh:Mesh;
  private var light:DirectionalLight3D;

  private var isMouseDown:Boolean;
  //navigation variables
  private var lastPanAngle:Number;
  private var lastTiltAngle:Number;
  private var lastMouseX:Number;
  private var lastMouseY:Number;

  public function away3() {
   initEngine();
   initLights();
   initMaterials();
   initObjects();
   initListeners();

   isMouseDown = false;
  }

  /**
   * Initialise the engine
   */
  private function initEngine():void {
   scene = new Scene3D();
   camera = new HoverCamera3D();
   camera.zoom = 1;
   camera.focus = 100;
   camera.distance = 80;
   camera.targetpanangle = camera.panangle = -10;
   camera.targettiltangle = camera.tiltangle = 20;

   view = new View3D({camera: camera, scene: scene});
   //view.session = new BitmapRenderSession(1);

   //view.mouseZeroMove = true;
   addChild(view);

   stage.quality = StageQuality.HIGH;
   //stage.quality = StageQuality.LOW;
  }

  /**
   * Initialise the lights
   */
  private function initLights():void {

   //light = new DirectionalLight3D({color:0xFFFFFF, ambient:0.25, diffuse:0.75, specular:0.9, x:40000, y:40000, z:40000});
   light = new DirectionalLight3D();
   light.color = 0xFFFFFF;
   light.ambient = 0.25;
   light.diffuse = 0.75;
   light.specular = 0.9;
   light.x = 0;
   light.y = 1000;
   light.z = 1000;

   scene.addChild(light);
  }

  /**
   * Initialise the materials
   */
  private function initMaterials():void {
   material = new PhongBitmapMaterial(Cast.bitmap(materialImage));
   material.specular = 0.5;
  }

  /**
   * Initialise the scene objects
   */
  private function initObjects():void {
   //model1 = Collada.parse(Charmesh, {scaling:10, material:material, mouseEnabled:false});
   collada = new Collada();
   //collada.scaling = 0.1;
   model = collada.parse(colladaData) as ObjectContainer3D;
   model.materialLibrary.getMaterial("mat1").material = material;
   model.mouseEnabled = false;

   scene.addChild(model);

   //mesh = model.getChildByName("obj1-node") as Mesh;
  }

  /**
   * Initialise the listeners
   */
  private function initListeners():void {
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
   stage.addEventListener(Event.RESIZE, onResize);
   stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
   stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
   //stage.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);
   onResize();
  }

  /**
   * Navigation and render loop
   */
  private function onEnterFrame(event:Event):void {
   //update the camera position
   //camera.moveTo(0, 70, -10);
   if(isMouseDown) {
    camera.targetpanangle = 0.3 * (stage.mouseX - lastMouseX) + lastPanAngle;
    camera.targettiltangle = 0.3 * (stage.mouseY - lastMouseY) + lastTiltAngle;
   }
   camera.hover();

   //render scene
   view.render();
  }

  private function onMouseDown(event:MouseEvent):void {
   lastPanAngle = camera.targetpanangle;
   lastTiltAngle = camera.targettiltangle;
   lastMouseX = stage.mouseX;
   lastMouseY = stage.mouseY;
   isMouseDown = true;
   stage.addEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
  }

  private function onMouseUp(event:MouseEvent):void {
   isMouseDown = false;
   stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
  }
  
  /*private function onMouseWheel(e:MouseEvent):void {
   if(camera.distance > 20) {
    camera.distance -= e.delta * 1.5;
   }
  }*/

  private function onStageMouseLeave(event:Event):void {
   isMouseDown = false;
   stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
  }

  /**
   * stage listener for resize events
   */
  private function onResize(event:Event = null):void {
   view.x = stage.stageWidth / 2;
   view.y = stage.stageHeight / 2;
  }
 }
}

[Away3D]Away3Dにも手を出してみる。

ActionScriptの3Dライブラリは今までPapervision3Dを使ってきましたが、ここらでAway3Dにも手を出してみたいと思います。

自分の開発環境は、Flex Builder3(Flex SDK 3.3)です。

Away3Dに手を出そうと思ったきっかけは、これです。
Pv3Dだと解決方法わからなかったので、Away3Dならなんとかなるかも・・・と思った次第です。

Away3Dの導入方法を紹介します。
Away3Dはこちらの公式サイトから手に入れられます。
WindowsだとTortoiseSVNを使う方法が一般的かもしれませんが、svnチェックアウトするとファイルの量が大量にあるし、新しくソフトをインストールするのも面倒なので、個人的にダウンロードページから個別にDLする方法をお勧めします。

以下一部画像付きで解説。
1.Away3Dで手に入れたいバージョンをダウンロード。(とりあえず最新版)
  exampleも一緒にダウンロードしとくといいと思います。


2.zip解凍。

3.解凍したフォルダの中の「examples_3_4_0」にソースパスを通す。
プロジェクトのプロパティ
ActionScriptビルドパスの「フォルダを追加」でフォルダを指定。

4.プロパティのActionScriptコンパイラ、「必要な Flash Player バージョン」を10に。

設定はこれで完了です。

次回Away3Dで作ったものを載せようと思います。

2009年11月5日木曜日

CSS Nite in FUKUSHIMA, Vol.3に行ってきました。

10/30(土)に開催したCSS Nite in FUKUSHIMAに参加してきました。
CSS Niteに参加するのは前回のin FUKUSHIMA, Vol.2に次いで2回目です。
ちなみに記事の内容はCSS Niteにほとんど関係ありません。

当日の自分の行動。
車のタイヤの空気入れて出発

猪苗代でちょっと給油

郡山到着 ファミマで休憩

金がなかったので適当な郵便局で5千円おろす

コジマ

ヨドバシ

CSS Nite

サイゼリヤ

GEO

郡山でガソリン満タン給油

帰宅
折角郡山に行くので会津にないものにいくつか行ってきました。

郡山市内は意外と道路が入り組んでいて、一方通行が多かったです。ガソリンが会津に比べて安いので満タン入れてきました。
途中でヨドバシに寄ってるのはAcerのノートPCに触ってみたかったからです。会津で取り扱っている店がないので。

イベントは概ね満足。ただもう少し時間が短くて、参加費が安いほうが個人的にうれしいです。

フォクすけハンドタオルをいただきました。これは番号抽選ではなく、じゃんけんで残った人の自己申告で貰えたので本当に自分が当たったのか不安です。持って帰ってきてよかったのかなぁ・・・
ちなみに自分は普段ブラウザはOpera使ってます。

イベント終了後自宅に帰る前に、サイゼリヤで夕飯を食べてきました。
近くにサイゼリヤがないので、存在自体を最近まで知らなかったのですが、悪くないです。
ただピザはおいしくなかった。それと基本四人席だったので一人で入ると申し訳なくなります。
そして近くにあったゲオで、
バーニングレンジャーとバーチャコールSを購入。
暇ができたらこれらを是非プレイしたい。