改め Objective Technician

はぐれ技術者のやりたい放題

ウケた

2009-12-20 00:09:11 | プログラミング
研究の合間にまたWiiリモコンとFlashで遊んでいたときのこと.


Wiiリモコンは振動機能がついていて,Flash側から好きなタイミングでバイブレータをON/OFFできる.

バイブと加速度センサのコントロールを組み合わせてちょっとしたアプリを作ろうとしたけど,なんかいつもより加速度センサの値が安定しない.


なんでかなと一瞬考えて,それはあまりにも当り前の事実であることに気づいて,次の瞬間に100万回「なるほど」とつぶやいた.


なんか,あまりにも納得しすぎて余韻が収まらない.







というか,やる前にこれぐらい予測できろよ...orz








Wii リモコン赤外線センサの手振れ対策

2009-12-06 21:54:40 | プログラミング
Wiiリモコンの赤外線センサで位置を取得する際の手振れ補正について.


ざっと思いついた素朴な方法をいくつか



その1:手振れ補正なしの場合

	private function onUpdate(event:WiimoteEvent):void {

		point.x = 800 - wii.ir.x1 * 800;
		point.y = wii.ir.y1 * 600;
	}


wii は Wiimote インスタンス.point.x, point.y は Flash上での座標.

手振れ補正なしで Wiiリモコンの位置をディスプレイ上にマッピングすると細かい場所のポインティングが難しい.


その2:ダンパみたいにする

	private function onUpdate(event:WiimoteEvent):void {
			
		var px:uint = 800 - wii.ir.x1 * 800;
		var py:uint = wii.ir.y1 * 600;
			
		var k:Number = 0.3;
			
		point.x += k * (px - point.x);
		point.y += k * (py - point.y);
	}


目標移動量に対してk(0~1)倍した分だけポインタを動かす.kが小さいほど追従が遅れるけど反応が鈍いだけ手振れが抑えられる.


その3:非線形マッピング

	private function onUpdate(event:WiimoteEvent):void {

		var px:uint = 800 - wii.ir.x1 * 800;
		var py:uint = wii.ir.y1 * 600;

		var dx:int = px - point.x;
		var dy:int = py - point.y;
			
		var a:Number = 2;
		var b:Number = 200;
			
		point.x += (dx > 0 ? b : -b) * Math.pow(Math.abs(dx) / b, a);
		point.y += (dy > 0 ? b : -b) * Math.pow(Math.abs(dy) / b, a);
	}


a は 1 より大きい数(指数),b は閾値みたいなもの.
Wiiリモコンの操作量に対するポインタ移動量が,bより小さいときは小さめに,bより大きいときは拡大して反映されるように関数を設定する.
Wiiリモコンが少し動いたぐらいだとポインタはほとんど動かない.最適なパラメータの設定が面倒かも.


その4:2と3の合わせ技

	private function onUpdate(event:WiimoteEvent):void {

		var px:uint = 800 - wii.ir.x1 * 800;
		var py:uint = wii.ir.y1 * 600;

		var dx:int = px - point.x;
		var dy:int = py - point.y;
			
		var a:Number = 2;
		var b:Number = 200;			
		var k:Number = 0.3;

		point.x += (dx > 0 ? b : -b) * k * Math.pow(Math.abs(dx) / b, a);
		point.y += (dy > 0 ? b : -b) * k * Math.pow(Math.abs(dy) / b, a);
	}




ちゃんとパラメータを設定すればいいのだろうけど,使ってみて違いはあまり分かんない.




Wiiのゲームではどんな方法で手振れ対策がされてるんだろうか








package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import org.wiiflash.events.WiimoteEvent;
	import org.wiiflash.Wiimote;
	

	public class Main extends Sprite 
	{
		private var wii:Wiimote;
		private var point:Sprite;
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			wii = new Wiimote();
			wii.connect();
			wii.addEventListener(WiimoteEvent.UPDATE, onUpdate);			

			point = new Sprite();
			point.graphics.beginFill(0xffff00);
			point.graphics.drawCircle(0, 0, 4);
			point.graphics.endFill();			
			addChild(point);
		}

		private function onUpdate(event:WiimoteEvent):void {
			//ここ
		}
	}	
}


グラフ3彩色問題

2009-11-18 21:43:31 | プログラミング
けっこう昔に作った Flash アプリ.


任意のグラフを生成したあと,その3彩色問題を 3-term DNF 学習問題へ還元して解となる3-term DNF が満たす条件の例を生成する




クリックでFlashページに飛びます




補足:

グラフ3彩色問題は、次の変換によって 3-term DNF 学習問題へ還元される。
・ノード vi と変数 xi との対応: 3-term DNF f(x1, x2, …, xn) の第 c 項(c = 1, 2, 3) に xi が含まれないとき、色 c を vi へ割り当てることができる。
・全てのノードにいずれかの色が割り当てられる条件: すべての i について、xi のみが 0 で他の変数がみな 1 のとき f は充足される。(xi を含まない項が少なくとも1つ存在する)
・隣り合うノードに異なる色が割り当てられる条件: すべての枝についてその両端のノードに対応する変数 xa, xb が 0 で、他の変数がみな 1 のとき f は充足されない。(xa, xb を共に含まない項が存在しない)

闘ってないとダメなんです

2009-11-14 18:29:40 | プログラミング
AS3とPV3Dで作ったルービックキューブに視差を付けて両眼立体視できるようにしてみた.

これは飽きない


(CLICK)











このごろずっとラボに引きこもってる状況が続いていて,なんか精神衛生上よろしくない.


1つのタスクに集中できる状況というのは一見理想的なようで,実はそうじゃないと昔から思ってる.


少なくとも僕にとっては複数タスクを同時に抱えているほうが気持ちいい.

行き詰ったらしばらく考えたあと他の作業に逃げればいいし,むしろ温めてた考えは別の仕事しててひらめくことが高頻度であるので,今の状況のままだと思考が凝り固まりそうで危ない.


なんでもいいから面白いこと探して始めよう.とりあえず走ろう.






Object Unknown

2009-11-04 00:36:29 | プログラミング
彼は FlashDevelop を起動するとおもむろにコードを書き始めた。

実験のあいだに時間ができたので、副業でやっている仕事を少し進めようと思ったのである。


少なくともその時点で彼の頭の中では完成品の動く様子が明確にイメージできていたに違いない。

しかしコーディングを進めれば進めるほど、そのイメージは虚しく次第に形を失っていった。

不思議なことに、当初の目標に対する進捗率はソースの記述量と経過時間とに反比例し、もはやコードを書いている本人でさえいったい何を作りたいのか分からない状態となっていった。


ふと我に返るといつの間にかエラーや警告が全て消えていた。きっと小人の仕業であろう。

彼はその動作を全く予想できないまま F5 キーを押下した。

コンパイルが通り FlashPlayer が立ち上がるとそこには奇妙な形のオブジェが現れ、その物体はやはり予想通りに予測不可能な挙動を示していた。



(CLICK!)



艶めかしく動き回るそのオブジェを呆然と眺めた後、しばらくして彼は「ああそうか、僕はこの数10分をムダにしたんだ」と初めて気づいたのである。



間池留出版 イサベラの「困ります、ブラウンさん(第二版)」より


Wiiリモコンで赤外線信号を可視化

2009-10-29 00:03:23 | プログラミング
ケータイやテレビリモコンなどの赤外線信号を Wiiリモコンで拾ってパルスを可視化





実装は AS3 と WiiFlash.

上の動画は、ケータイでプロフィールを送ろうとして赤外線通信の相手を探してるときの信号列。

下の緑のラインは1秒ごとの目印。


このケータイは、8回トライして応答がなかったらあきらめる仕様らしい。



Wiiリモコン側と通信機器側の同期がとれているわけではないので、信号列全部を拾えてはいない。

全力で頑張るフリをするよ、寝ててもできるけどな

2009-10-28 01:13:23 | プログラミング


OK, I'll pretend this requires all my attention, when we both know I could do it in my sleep.


Twenty Four の SeasonⅤ でモリスが通信機器の改造を頼まれたときに言ったセリフ。


いつかどこかで使ってみたい。




以下は、バイトで作ってる物理シミュレーションの Flash 3件
(これの続き)

今回は物理エンジン Box2D を使ったもの。




画像リンクをクリックするとシミュレーションページに飛びます。


・気体の分子運動




・Newton's cradle




・クレーン車の転倒




つづく



メモ:

b2Body の衝突検出には b2ContactListener を継承したコンタクトリスナを使う。

例えば、衝突時に音を鳴らしたいときは↓みたいなクラスを作る。

普通のイベントみたいにコンタクトイベントがあるのかと思ったけど、仕様らしい。

package  
{
	import Box2D.Collision.b2ContactPoint;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2ContactListener;
	import flash.media.Sound;
	import flash.net.URLRequest;
	
	public class ContactListener extends b2ContactListener {
				
		private var sound:Sound;
		
		public override function Add(point:b2ContactPoint):void {
			
			sound.play();
		}
				
		internal function load():void {
			sound = new Sound(new URLRequest("sample.mp3"));
		}
	}

}