3Dゲームを作っているのですが、行列計算で気が狂いそうです。 助けてください。
こんばんは。
初めて相談箱を利用する、NTD_Kyotoと言う者です。
忙しいので、積極的にレスしたり、すばやく返答したりと言う事が出来ない身ですが、よろしくお願いします。
高校時代ウェブ系のプログラムを始めたが、自宅パソコンが糞と言われたメーカーと糞といわれたOSと、多分ウィルスに呪われておかしくなり、一時プログラムを断念。
その後、コンピュータ系の学校に進学し、自分のパソコンを買って3Dゲームを作り始め、一年に満たない程度という、おかしな経歴を持ってます。
本題に入りますが、素人故、今、ひとまず便利関数の多いDirectX9を使って3Dゲームの製作に取り組んでいますが、下に示す処理を目的とした3Dモデルの行列計算が、いよいよ想像できなくて困っています。
■困っている内容■
スマブラのメトロイドやポケモンのコースみたいな感じで、地形が回転することがある。
主人公の回転処理は、D3DXMatrixYawPitchRoll(RotMatrix, Rot.y, Rot.x, Rot.z);
主人公の移動処理は、D3DXMatrixTranslation(PosMatrix, Pos.x, Pos.y, pos.z);
で管理。
後に、3Dモデル描画関数に与える
D3DXMATRIX型変数、PlyaerMatrixに、
PkyaerMatrix = RotMatrix * PosMatrix * ModelRot ;
両者をかけ、D3DXMatrixAxisで、回転を与えている、これ↑
地形の回転行列を格納した値D3DXMATRIX型変数、ModelRotをかける事で、
主人公の位置を管理しているのですが。
見た目のみ表示用マトリックスで回転しているだけで、実体は回転していないほうのモデルなので。
たとえば45°回転後した後重力が”回転後の”床へと生じてしまうので.
○
..|............↓G
_____________
...○...\.|G
.........\ ̄./
.............../
仕方ないから、発想を逆転して、床の角度に応じて重力の向きを変え、あたかも地形が回転しても重力は下に働いているように見せるというプログラムを実装することで解決したのですが。
PkyaerMatrix = RotMatrix * PosMatrix * ModelRot ;
この処理で ↑こいつをかけているため、
主人公も、地形に合わせて、回転してしまうんです。
○←頭
|←体
______
回転前
○
......\/
...../
45°回転後
さらに45°
_____________
........|
......○
しかし、PkyaerMatrix = RotMatrix * PosMatrix * ModelRot ;
こいつをかけないと↑
結局、座標に忠実な真の地形の上を主人公が歩いてしまい、意味がない。
ようは、回転後も、現座標の床から離れることなく主人公の向きを下向きにしたいのです。
だれか、私にこの問題を解決する数学力をください!
お願いします!
お礼
非常に勉強になりました。 回答ありがとうございました。