トップページ > 記事閲覧
sin波を使ったカメラの移動
名前:くころこ 日時: 2013/11/14 19:43

はじめまして、よろしくおねがいします。 プログラミング暦は1年くらいです。 「サンプルプログラムの迷路を3Dで表示」のブロックとブロックの間を滑らかに移動するタイプを改造していて ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=2560 こちらのいっちさんのカメラの平行移動や球面移動を利用して、カメラの制御と移動をしています。 組み込むことは出来たのですが、そこにsin波を使って ゆっくり動き始めてゆっくり止まるにしようとしたら行き詰ってしまいました。 いっちさんのプログラムはこの行はこうゆうものぐらいにしか理解しおらず sin波も振幅ぐらいしかいじるところはないと思っていたので解決への糸口がなかなか見つかりません。 適切な移動量を得るにはどうしたらいいでしょうか?よろしくお願いします。 //「迷路を3Dで表示」sin波を使って移動 case 1 : // 前進中状態 // カウントを進める Count ++ ; // カメラの座標を移動途中の座標にする //------------------------------------------------------------------------------ //迷路を3Dで表示 //CamPos = VGet( x * BLOCK_SIZE, CAMERA_Y, z * BLOCK_SIZE ) ; //CamPos = VAdd( CamPos, VScale( CamDir, BLOCK_SIZE * Count / MOVE_FRAME ) ) ; //元のもの //こっちにはsin波を使うことができた //CamPos = VAdd( CamPos, VScale( CamDir, sin( DX_PI / 2 / MOVE_FRAME * Count ) * BLOCK_SIZE )); //sin波 //CamTarg = VAdd( CamPos, CamDir ) ; //------------------------------------------------------------------------------ //いっちさんの移動 move_rate = BLOCK_SIZE / MOVE_FRAME したもの //camera.target = VAdd( camera.target, VScale( VNorm( camera.position ), -move_rate ) ); //sin波を使ったもの camera.target = VAdd( camera.target, VScale( VNorm( camera.position ), -sin( DX_PI_F / 2.0f / MOVE_FRAME * Count ) * BLOCK_SIZE )); // カウントが移動時間に達したら実座標を移動して入力待ち状態に戻る if( Count == MOVE_FRAME ) { x += movx ; z += movz ; State = 0 ; Count = 0 ; } break ; //カメラの座標と角度をセットする SetCameraPositionAndTargetAndUpVec( VAdd( camera.target, camera.position ), camera.target, Camera.head );
メンテ

Page: 1 |

Re: sin波を使ったカメラの移動 ( No.1 )
名前:いっち 日時:2013/11/16 12:29

camera.target を再設定する処理が抜けているためではないでしょうか? 件の3D迷路では1回の前進処理の間(MOVE_FRAME)に必ず1000(BLOCK_SIZE)だけ移動する必要があります。 "sin( DX_PI / 2 / MOVE_FRAME * Count ) * BLOCK_SIZE" という計算式は Count の値に合わせて 0 〜 1000 の値をとるので、 それを累積させると当然 1000 を超えます。 もともとの処理では以下の行で毎回 CamPos を移動前の値に再設定した後に移動量を加算することで累積しないようにしています。 > CamPos = VGet( x * BLOCK_SIZE, CAMERA_Y, z * BLOCK_SIZE ) ;
メンテ
Re: sin波を使ったカメラの移動 ( No.2 )
名前:くころこ(解決) 日時:2013/11/16 15:48

ご指摘の通り camera.target = VGet( x * BLOCK_SIZE, CAMERA_Y, z * BLOCK_SIZE ) ; を加えることで正常に動くようになりました! カウンタは毎回足していけば最大値を超えるが 代入すれば最大値にぴったしということですね。 全く気づきませんでした>< ご教授ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存