もどる
fire1.gif 回せ!座標軸 00/03/20,00/03/22
「うまくいかないからオモシロイ」といいますが、僕は断固としてこれに 反対です。考えて考えた結果うまくいけば苦労も吹っ飛びますが、うまくいかなかったときは 腹立つだけです。ゲームにもいえますが、ずーっとうまくいかないとすぐ飽きちゃいます。

ちゅぅわけで、うまくいきません。
「オブジェクトが回転したとき」がぜんぜんうまくいきません。 確かに実行結果から、「回転してる」ってのはわかるんですが、今は回っちゃ駄目なんだよ!! あくまでも君自身が周るだけで、動いちゃ駄目なんだよ!!!なんつーか、例えるならそう「GEO」みたいな 感じになってほしいのよ!くるくる回って、とことこ進む、ってな感じになってほしいのよ!!

fig1_12.png
図のとおり、オブジェクトを回転させたときに向きと共に座標までも変わってしまうんです。 図のとおり、僕の求めているものとは違います。...なんで?考え方はあってると思うんだけどなぁ。 (軸ベクトル)×(位置ベクトル)とりあえず、コードを書いておきます。 おっと、軸ベクトルはZ軸回転しか計算してませんのでご注意を(行列の演算順序がわからないから)。

//RefFrame座標系での位置ベクトルPosを絶対座標系に変換してベクトルaに結果を渡す
procedure TransformGPos(var a:TVector;const RefFrame:TMover;const Pos:TVector);
var temp:Txyz;
    fp:TMover;
    mat:TMatrix;
begin

  temp:=Pos;
  fp:=RefFrame;
  while fp <> nil do begin //親フレームがnil(NULL)になるまで繰り返す
    mat:=MatrixRotateZ(trunc(fp.Coord.z));          //(軸ベクトル)
    IncVector(temp,TransformVector(fp.NowPos,mat)); //(軸ベクトル)×(位置ベクトル)
    fp:=fp.FSceneFrame;                             // 親ベクトルをセット
  end;

  a:=temp;

end;

00/03/22
朝起きたらパッとひらめいた。こういうことって最近よくあります。
上の図のような結果になってしまうのは考えてみたら当たり前でした。ホント、当たり前ですよね....。 位置ベクトルに軸ベクトルをかけてるんだから、まわっちゃうよね。 それでは、どうすればいいのか。答えはこうです。

(軸ベクトル)×(移動量)+(位置ベクトル)
こうすることによって、「円運動現象」が回避できます。理由は、軸ベクトルに位置ベクトルをかけるのではなく、 移動量をかけるからです。そうすることで、任意の向きに移動量進むことができるんです。そしてそれに 位置ベクトルを足しこむ。これで万事うまくいきます。


procedure TMover.Transform;
var temp:TVector;
    mat:TMatrix;
    fp:TMover;
begin

  temp:=ZeroVector;

  //(軸ベクトル)×(位置ベクトル)+ (座標軸の位置ベクトル)
  fp:=Self;
  mat:=MatrixRotateZ(trunc(fp.Coord.Z));
  IncVector(temp,TransformVector(fp.FMoveMent,mat));
  IncVector(temp,FPos);

  //親フレームがNULLになるまでループ
  while fp.SceneFrame <> nil do begin
        fp:=fp.SceneFrame;
        mat:=MatrixRotateZ(trunc(fp.Coord.Z));
        IncVector(temp,TransformVector(fp.FMoveMent,mat));
        temp:=TransformVector(temp,mat);
        IncVector(temp,fp.FPos);
  end;

  //絶対座標をセット
  FGPos:=temp;

end;
と思ったら、そううまくはいきませんでした。 移動量が大きくなるにつれて、回転運動が生まれてくるのです。これも当たり前といえば、当たり前です。 で解決策としてはどうすればいいのか?というと、座標計算が終わったら、 フレーム毎に移動量を位置ベクトルに足しこみ、移動量をクリアする、という方法でうまくいきそうです。 あと、ここまでやってみてやっと気づいたんですが、やはりこういう計算はDirect3DRMに任せたほうがよさそうですね(^^;)

で、動かしたものがこれです。

test3.png

カーソルキーの左右で火の玉が回転、上下で移動という風になっています。 カメラが火の玉を追っかけるようになっているので、どこへいっても火の玉が中心にくるようにしてあります。 あと、スクロールを実感しやすくするために背景には無限平面としてテクスチャを張ってあります。
次へ進む
※「うまくいかないからオモシロイ」
ホント、キレます。ただ、これがないとつまらない、っていうこともあるので きわどいところです。

※GEO
ASCII TechWinでおなじみのゲーム製作集団が 作った渾身のアクションロープレ。誌上で連載された後、 製品化された。たぶん、そこらの書店で手に入ります。

※Direct3DRM
DirectXのコンポーネントのうちのひとつ。比較的簡単に3Dが扱える。 設計が見事。と思う。参考にしてます。






もどる