hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
d3module/ドラッグでカメラを移動する - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

ドラッグでカメラを移動する

極座標について

ドラッグで移動するカメラを考える際、直交座標ではなく極座標を用いた方が作りやすくなります。 極座標についてはこちらのページをご覧ください(未作成)。

カメラの座標(r,θ,φ)のうち、角度θおよび角度φをドラッグした距離に応じて変化させます。
マウスカーソルの座標はmousex,mouseyで調べても構いませんが、ginfo_mx,ginfo_my(マウスカーソルの画面上の位 置)を使えばカーソルが画面から出ても使えます。

直交座標への変換 その1

さてd3moduleでは直交座標系を使うので、極座標を直交座標へ変換する必要があります。
最も簡単なものは変換の公式

a math image

を利用する方法です。例えばカメラを(r, t, p)に移動させる場合は

  1
 
    d3setcam r * cos(t) * sin(p), r * sin(t) * sin(p), r * cos(p)

となります。

直交座標への変換 その2

その他にも、d3moduleに用意されているd3vrotateを利用する方法があります。a math imageのベクトルをY軸を中心に角度pだけ回転させ、その後Z軸を中心に角度tだけ回転させればa math imageのベクトルに変化することを利用する方法です。例えばカメラを(r, t, p)に移動させる場合は

  1
  2
  3
  4
 
 
 
 
    // x, y, zを変数として
    d3vrotate x, y, z, 0, 0, r, 0, 1, 0, p
    d3vrotate x, y, z, x, y, z, 0, 0, 1, t
    d3setcam  x, y, z

となります。

サンプルスクリプト

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
-
|
|
|
!
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#include "d3m.hsp"
#const double CAMERA_R 300     // 極座標のr
#const double PI       3.1415  // 円周率
    camera_theta = 0.0         // 極座標のθ
    camera_phi   = PI / 3.0    // 極座標のφ
    old_mx = 0                 // 前回処理時(約50ミリ秒前)のマウスカーソルの座標
    old_my = 0                 // 前回処理時(約50ミリ秒前)のマウスカーソルの座標
 
*main
    gosub *move_camera
    gosub *draw
    wait 5
    goto *main
 
*move_camera
    getkey left_click, 1
    if left_click {
        if old_click {
            camera_theta += 0.01 * ( old_mx - ginfo_mx )
            camera_phi   = limitf( camera_phi + 0.01 * ( old_my - ginfo_my ), 0.01, PI - 0.01 )
            // ↑d3setcamの制約により、(x, y) = (0, 0) とならないようにlimitfを使う
        }
        old_mx = ginfo_mx
        old_my = ginfo_my
    }
    old_click = left_click
 
    // カメラ位置を変更
    // camera_DISTを変数にすれば、ズームイン/ズームアウトの演出が可能
    d3vrotate camera_x, camera_y, camera_z, 0, 0, CAMERA_R, 0, 1, 0, camera_phi
    d3vrotate camera_x, camera_y, camera_z, camera_x, camera_y, camera_z, 0, 0, 1, camera_theta
    d3setcam  camera_x, camera_y, camera_z
    // ↑この3行は
    // d3setcam CAMERA_R * cos(camera_theta) * sin(camera_phi), CAMERA_R * sin(camera_theta) * sin(camera_phi), CAMERA_R * cos(camera_phi)
    // と同等
    return
 
*draw
    redraw 0
    color : boxf
    gosub *draw_axes        // 座標軸を描く
    gosub *draw_box         // 箱を描く
    redraw 1
    title strf( "θ:%f / ", camera_theta ) + strf( "φ:%f", camera_phi )
    return
 
*draw_axes
    color , 128
    repeat 3
        d3arrow 100 * ( cnt == 0 ), 100 * ( cnt == 1 ), 100 * ( cnt == 2 ), -100 * ( cnt == 0 ), -100 * ( cnt == 1 ), -100 * ( cnt == 2 )
        d3mes strf( "%c", 'X' + cnt ), 120 * ( cnt == 0 ), 120 * ( cnt == 1 ), 120 * ( cnt == 2 )
    loop
    return
 
*draw_box
    color 255, 128
    d3box -50, -30, -20, 50, 30, 20
    return
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-08-21 (火) 19:30:04 (2300d)