ディープなものや
ジャズテイストなものや
本当にお洒落なハウスはいかがでしょうか?


大阪に昔あったレコード屋の店長に教えてもらってから、
ずっと好きなレーベルがあります。
ジャジーなディープハウスをメインにリリースする「i Records 」というレーベルです。
(最近は少し違うのもリリースしてるようです。)





このレーベルから出てるお勧めのディスクが
すさまじくかっこよくおされなジャズハウスを聞かせてくれるコンピレーション「
The Jazz Influence 3
(こいつはクラブミュージックが好きじゃなくても聴けてしますセンスのよさが有る)
                      と
i Rec の看板アーティストペア(Kevin Yost & Peter Funk)によるビートの利いたハウス
「BeatKilla 2
(ミニマルテクノが好きなら好んじゃうと思う。これをハウスってジャンルに分けますか?というレベル。最高。)

このレーベルのCDは市場では殆ど見かけないんですが、
i Rec は BearPortでこれでもか!と同じ曲をリリースしまくってるので、
そこで音源だけ入手するか、
AmazonでCDを購入するのが手っ取り早いと思われます。

Jazz Influence は 1も2ともとてもいいので全部試聴してみる事をお勧めする。
Kevin YostのCDはタワレコでも置いてあったりするので、ふと買ってみるのもいいかも。
トウキョウ以外のレコード屋には無いと思っても過言じゃないかと。



-------------------
音楽の試聴はすべてを無料で出来るようにするべきだと考える。
買わないやつは買わないし、
知らない曲は買わないし、
どうせ売れないなら曲だけ聴いてもらえばいい。
聴いたら買うやつが出てくる。

買わないやつはどっちにしろ買わない。
コピーするなりダウンロードするだけ。
無理にコピー不可にすると客足が遠のくだけださ。
音楽ファンはコピーできてもディスクを買うから。
そうしないと音楽がなくなるってのが解ってるから。


------------------
Yukiが可愛いんです!
The End of Shite
Biscuit
いきなり3DのMapを作成するのも理解が難しそうだったので、
2Dの衝突判定のサンプルであるTransformedCollisionGame のソースを見ることにする。
決して、パイプラインのソースがよく解らなかったとかじゃないからね(汗


Windows用のソリューションを開いてみると、
いつも通りprogram.csとGame.csがあって、今回はBlock.csというのもあるみたいだ。

Block.csの中をのぞくと・・・
Vector2とfloatのフィールドがあるだけ。
ふむ。
ブロックは複数表示するからクラスにして、状態をそれにもたせてるんですな。


で、メインのprogram.csです。

ひとまず、順にフィールドから観ていく。
・XNA1.0の頃のソースのためGraphicsDeviceManagerを宣言。
・画像を読み込むために、Texture2Dを作成。
・頂点データ(?)のために、Color[]を作成。
・描写のためのバッチを作成(SpriteBatch)。

・キャラクターの位置を保持する、Vector2。
・キャラクターの移動速度、int

・画面に表示するブロックのList
・ブロックを新たに作成する頻度(BlockSpawnProbability)
・そのまま・・・BlockFallSpeed
・ブロックを高速回転させよう(BlockRotateSpeed)
・ブロックの中心位置かな(blockOrigin)

safeBoundsは、SafeAreaPortionで指定された分移動範囲を狭める。
(初期のままだとSafeAreaPortionを変更するとY座標も移動してしまう。
0.5以下の値で試さないとパーソンが消えちゃう。
安全地帯へ逃げたのかな?)


--------------
そして、メソッドを観ていく。
Initialize()では、
特に変わったことをしてなく
viewportを取得して移動範囲とパーソンの初期位置を指定する。

LoadContent()も、
テクスチャを読み込み、データを取得する。

blockTexture = Content.Load<Texture2D>("SpinnerBlock");
blockTextureData = new Color[blockTexture.Width * blockTexture.Height];
blockTexture.GetData(blockTextureData);

personTexture = Content.Load<Texture2D>("Person");
personTextureData = new Color[personTexture.Width * personTexture.Height];
personTexture.GetData(personTextureData);

バッチ作成とブロックの中心を取得する。
blockOrigin = new Vector2(blockTexture.Width / 2, blockTexture.Height / 2);
spriteBatch = new SpriteBatch(graphics.GraphicsDevice);


で、メインのUpdate(GameTime gameTime)です。

始めの方に入力デバイスを取得して、入力値を反映する。
その後に、MathHelper.Clampを使用してパーソンが画面位置から出ないようにしている。
personPosition.X = MathHelper.Clamp(personPosition.X,
safeBounds.Left, safeBounds.Right - personTexture.Width);

で、3D位置に変換している。

次に、ブロックの新規作成判定。
特に変わったことなく、Randomクラスを使用して追加している。



衝突判定を行うために、personRectangle(Rectangleクラス)をパーソンの位置から作成する。
で、全ブロックの位置を更新し、パーソンとの衝突判定を行う。

まずは、Blockのフィールドを更新する。
blocks[i].Position += new Vector2(0.0f, BlockFallSpeed);
blocks[i].Rotation += BlockRotateSpeed;

で、3D座標を作成する。
移動は左上を原点に計算するので
Matrix.CreateTranslation(new Vector3(-blockOrigin, 0.0f))
をかけてから、
回転させ、移動させる。

で、パーソンと同じようにRectangleを作成する。

単純な衝突判定を行い(personRectangle.Intersects(blockRectangle))

で、最高に肝のIntersectPixelsメソッド・・・・。
わからねー・・・orz

//A = personTransform, B = blockTransform
Matrix transformAToB = transformA * Matrix.Invert(transformB);
はいったい何?

その後は、パーソンのピクセル分ループさせて、
パーソンのテクスチャのα値が0じゃなくて、
ブロックのテクスチャのtransformAToB座標のα値が0じゃないなら
衝突していない。
と判定している。
//xAとyAはパーソンのピクセル位置
Color colorA = dataA[xA + yA * widthA];
Color colorB = dataB[xB + yB * widthB];

if (colorA.A != 0 && colorB.A != 0)
return true;

なんとなく
このメソッドはパーソンとブロックの短形が重なっていていないことないので、
ブロックはパーソンと重なっている部分だけを検査していって、
パーソンも、ブロックも黒かったら衝突という事にしているのでは?
と予想がつくが、Matrixの計算結果の意味がわからないと・・・

パーソンにブロックの逆行列をかけると何が起こる?
うーん・・・。

--追記1
スクリーン座標からワールド座標を得る
座標系は
ローカル座標->ワールド座標->スクリーン座標 という順に変換して画面に描写しているわけで
座標系を逆に戻していくには逆行列を作成すればいい。
ふむ。逆行列はそういう性質があると。

じゃ、パーソンのワールド座標とブロックのワールド座標の逆行列をかけるということは・・・
パーソンのワールド*ブロックのローカル座標をかけるということ。
うーん?
パーソンをブロックの中心に移動させるってこと?

--追記2
わかった!
まずは、コメントを見ると書いてあった。
「ワールド座標のパーソンとブロックのローカル座標からマトリックスを作ります」と。
英語ダカラって無視しないで、よく読めと。

まずは、例の掛算をすることで
ブロックのローカル座標でパーソンのいる位置を表すMartixが作成できる。(これがほぼ回答ですにゃ)

setpXとsetpYをわざわざ作っているのは、
ブロックのローテーションがパーソンと違っているので単純なループだとずれが生じてしまうから。

で、パーソンは単純に一ピクセルずつ見ていって、
ブロックはさっき作ったMatrixの位置(パーソンが乗っかっている部分)のピクセルを見ていく。
両方のα値が0じゃないなら接触しているってことだから!!

どかーん!!
ってわけですん。

なるほど!
公式サイト
原作

-あらすじ-
日本新聞社・バンコク支局の南部が同僚から日本への臓器密売の情報を得て、調査を始める。
ひょんな動機でタイで人権保護を行うNGOに参加した恵子は、突然子供たちがいなくなっていることを知る。
そんな恵子たちの元へ匿名の一通の手紙が届く。売春宿から。
南部と恵子。それぞれが真実を求めていくうちに、耳を疑う、目を伏せる真実を知る事になる。
--------


--------
映画の冒頭から言葉を失う。
体に斑点のある横たわった少女がこちらを見続ける。
ジッ・・・と。

その時に吐き気をもよおす覚悟を決めた。この映画は観てるのも辛そうだ。
本当に本当にすべてが真実だとするならば、
衝撃的な事実があまりにも多すぎる。

数々の信じられないような実態と、
資本主義の現実と、
団体の無力さと、
組織の強さと、
葛藤と、

自分ならどうしますか?



この映画を観ると、今まで心の奥底に眠いって板正義感がむくむくと目を覚ます。
そして、凄く嫌な気持ちになる。
ところどころで言っていた。
彼方ならどうですか?と私は思う。

観終わった後に所詮エンターテイメントとしてしか観ていなく、
如何こうしようとしない自分に対し凄い嫌悪感を感じた。
感じたところでどうもしないのだけれども。
映画を観て何か行動を起こす人が少なからずいるのであろう。
とても尊敬に値する。


--------
映画はとても良かった。
ただし、最後に流れた曲が最低最悪。
すべてをぶち壊してくれた。
なんと安っぽい。心のない。意味の無い音楽。
この映画を観ていて一番の怒りだった。作品をすべて壊してくれた。
なんで、桑田けいすけか?(漢字知らん)
なんでそんなやつの曲を選ぶかね。
一瞬にして現実感がなくなる。
あまりにも重たい話だったから、わざと力が抜けるような曲を選択してるのかもしれない。
それでももっと曲を選んで欲しい。
本当にぶち壊しだ。


キャストだけども、
江口さん良かった。
妻夫木のダメーな感じも良い。彼は駄目な感じが似合うね。
ただ、宮崎あおいはダメだ。
可愛すぎ て話を聞けない。
「あぁ、うんうん。(カワイイなぁ)」となってしまう。
怒ってるシーンなんて物凄くかわいい。
うん、まぁカワイイからいいんだ。


映画に関して色々な紹介文が書かれていますが、
内容が書かれているので衝撃が少しやわらかくなってしまう。

知ってても映像としてみると凄い衝撃だけども、
紹介文を読まずにピュアな状態で見た方が良い。
なので、あんまり中身は書かない。


そんなわけで、
観て損のない映画だとは思います。
最後のスタッフロールに入る前に出た方がいいです。
http://creators.xna.com/en-us/sample/collision3dheightmap
XNA Creators Clubの上記サンプルシリーズのサンプルを参照すればよい。
始めは2Dで、3Dになり、高さをつけ、最後は戦車の移動となる。

ソースを軽く眺めると、
Contentsにマップのテクスチャを置いて、
パイプライン(プロセッサとインポータ)を自分で作成して、
作成したマップにそのテクスチャを貼り付けていく感じのようだ。

(パイプラインに関しては、XNA入門 を読めば解ると思う。)

戦車を動かすサンプルに関しては、戦車の中心がMapと接しているかどうかを判定しているだけで、
でこぼこがあったとしても傾きがリアルではないようだ。(ソースを見る限りだが)

ってか、先日考えていた戦車の移動のさせ方があっさり書いてあったよ。
まぁ、いいんですけど。


なので、XNAで使える物理エンジンを探していた。
Bullet というMITライセンスのものがオープンソースなので
今後物凄く成長していくのではという期待をこめてこれをチョイス。

PhysXというものも良さそうだったのだが、
XNAでももりもり使えるかよく解らなかったので放置。
(3D系ならDirect3Dをもりもり使えないといけんのかなぁ。)

NaturalMotionendorphinも試してみようかと思う。
GTA4で採用された物理エンジンを作っている会社みたいですよ。


FBXファイルを作るにはMAYAとか3DスタジオMAXとかいるのかぁと思ってたら、
Autodesk FBX SDKの中にエンコーダーが入っているみたい。
これを使えばPoserのデータもFBXに変換できそうです。
色々と試していたけれどもどうしても上手く行かないので、絵に書いて考えていた。


要するところに、
 ・左右を押されたときはRotationを変化させるだけにする。
 ・上下が押されたときは、[現在位置]に[移動量]*Rotationで計算した座標を加算する。
 ・モデルのワールド座標にRotation * [計算した座標]を設定する。
ことで、ちゃんと向いている方向に移動するようになった。


ようやく動いた感じです。
動いている動画をとりたいけれども、良いソフトないかなぁ。


ソース的には、


private void HandleInput()に追加
-----------
if(currentKeyboardState.IsKeyDown(Keys.Up)){
tankPosPre += 20f;
}

if(currentKeyboardState.IsKeyDown(Keys.Down)) {
tankPosPre -= 20f;
}
if(currentKeyboardState.IsKeyDown(Keys.Left)) {
tankRot += 0.1f;
}
if(currentKeyboardState.IsKeyDown(Keys.Right)) {
tankRot -= 0.1f;
}
-----------

フィールドを追加
-----------
float tankPosX = 0.0f;
float tankPosZ = 0.0f;
float tankPosPre = 0.0f;
float tankRot = 0.0f;
------------

protected override void Draw()に追加と変更
------------

//初めは自動で回転するようになってるので、キー入力を反映するようにする
Matrix rotation = Matrix.CreateRotationY(tankRot);

//上下キーでZ方向に移動するようにしているので
      //移動Matrixを作成し、向いている方向のベクトル(Matrix)を使って変換する
Matrix movePosition = Matrix.CreateTranslation(0, 0, tankPosPre) * rotation;
    
      //XとZのみ使えればいいのでVectorに変換しておく
Vector3 position = movePosition.Translation;

//現在位置に移動量を加算
tankPosX += position.X;
tankPosZ += position.Z;

//回転させてから、位置を更新する
tank.Draw(
rotation
* Matrix.CreateTranslation(tankPosX, 0, tankPosZ)
, view, projection, rotation);

//移動が終了したので移動量をクリアする
tankPosPre = 0.0f;
------------


XNAのはじめ方の詳細は他のブログなどを参照してもらうとして、
 ・,netフレームワーク2のインストール
 ・XNAGAMEStudio2のインストール(XBOXのゲームを作りたいなら2を入れる。そうじゃないなら3を入れる)
 ・任意だけど日本語版のリファレンス
のみです。

で何したらいいか解らないと思うので、
XNACreatorsClub(http://creators.xna.com/)の
EDUCATIONから自分の作りたいゲームの参考になりそうなサンプルを落としていじり倒す。

オーバーライドしてるメソッドがナンなのかは下のサイトを見れば大体わかる。
(ただし、XNAのVer1なので少々異なる箇所があります)
http://www.microsoft.com/japan/msdn/vstudio/express/learn/xna/

で、http://creators.xna.com/en-us/sample/simpleanimation
に少し変更を加えて、キャラの移動を行っている。



---------------
キャラを作成してる座標系で移動させると
訳(増える)ワカメになることが分かった。

MSDNのカメラ移動のサンプルを見てたら、

1. キャラの向いている方向のベクトルを保持させておく。
2. 移動させたい距離のベクトルを作成((0,0,10)のように、Z方向のみでよい)する。
3. 2のベクトルに1をかけて回転させる。
4. 変換後のベクトルのX、Z成分をワールド座標に反映する。(Y方向は地形次第)

でばっちりだよね!(用語の誤用に関してはやさしめに突っ込んでくらさい)
なるほどねぇ。言われたらうんうん。だよだよ。気づけよって感じね。
方向と移動量さえわかれば良かったんだ。単純な話だ。

<task1>
実装はしてないけど、いけると思う。

<task2>
移動が出来たら視点の切り替えを実装だ。
予想では、BasicEffectのViewに突っ込むMatrixに変換用Matrixを埋めておいて、
そいつを切り替えるだけでよいと思っておる。

<task3>
始点の切り替えが出来たら、凹凸の有るマップの作成と、
凹凸をキャラ位置へ反映すること。
これは、どうすればいいのかわからんのだが?
マップ表現のサンプルを探さないと。

<task4>
草などの自分以外のオブジェクトをマップに作成。
model増やしてあげるだけだと思ってますよー。
データの持ち方を工夫してあげると楽そうだね。

<task5>
草とキャラの衝突判定。
そのうち考える。


<task6>
ゲームのタイトルとプレイ中などのシーン切り替えかた。
gameクラスを上手く使えば簡単に出来る気がしてる。

<task7>
そのうちなんかでてくるだろ。

練習として、
キャラで移動した場所を自分の陣地にする陣取りゲームを作るのだ。


-か-ん-そ-う-
行列って、掛算すれば、位置が回転したり、移動したりするの面白いね。
パーツかされてる感じで凄く良く出来てるなぁと。
数学って面白い。マジックだね。
化学ほどじゃないけどねー(化学贔屓で御座います)



線形代数、挫折したけどもう一度がんばってみるか。
その前に集合知を・・・。あと、セキュリティ・・・。の前にソフ開のテスト。加えてLPI・・・。
ボルダリングもしたい。走りたい泳ぎたい。太鼓叩きたい。
一日50時間ぐらいあればいいのに。