|
「うまくいかないからオモシロイ」といいますが、僕は断固としてこれに
反対です。考えて考えた結果うまくいけば苦労も吹っ飛びますが、うまくいかなかったときは
腹立つだけです。ゲームにもいえますが、ずーっとうまくいかないとすぐ飽きちゃいます。
ちゅぅわけで、うまくいきません。 ![]()
//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に任せたほうがよさそうですね(^^;)
で、動かしたものがこれです。 ![]() カーソルキーの左右で火の玉が回転、上下で移動という風になっています。 カメラが火の玉を追っかけるようになっているので、どこへいっても火の玉が中心にくるようにしてあります。 あと、スクロールを実感しやすくするために背景には無限平面としてテクスチャを張ってあります。 |
※「うまくいかないからオモシロイ」 ホント、キレます。ただ、これがないとつまらない、っていうこともあるので きわどいところです。
※GEO
※Direct3DRM
|