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

カメラワーク [hsp3]

レースゲームの、演出の決め手となるカメラワークを色々考えてみましょう。

叩き台スクリプト

こんなカメラワークもアリだぜ!みたいな追加もどしどしお寄せください。
CAM_MODE_MAX の値と *moveCamラベル を改造すればカメラワークを増やせます。

d3moduleを使用していますので、http://sprocket.babyblue.jp/からDLしてください。
座標系についてもsprocketさんのサイトを参照のこと。

カメラ操作に関する変数一覧(すべて実数)

carX, carY, carZ
車の座標を直交座標系で表現したもの。carZは0に固定。
carT
車の向きを弧度法で表したもの。単位はラジアン。X軸方向(マップでは右)を0とします。
camX, camY, camZ
カメラの座標を直交座標系で表現したもの。
camT
車から見たカメラの向きを弧度法で表したもの。単位などはcarT同様。

カメラ操作に関する定数一覧

CAM_MODE_MAX
カメラモードの数(整数)。
CAM_DISTANCE
車とカメラの距離の基本値(実数)。
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
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
!
 
 
 
 
 
 
-
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
// 要d3module
/* 操作方法
    [Up]          : 加速
    [Left][Right] : 旋回
    [Space]       : カメラワークの変更
*/
 
#include "d3m.hsp"
 
#const PI 3.14159
 
#const AREA_X 320       // 走行エリアの広さ(横)
#const AREA_Y 320       // 走行エリアの広さ(縦)
#const GRID_DISTANCE 32 // グリッドの間隔
#const GRID_NUM_X 11    // グリッドの本数 (= AREA_X / GRID_DISTANCE + 1)
#const GRID_NUM_Y 11    // グリッドの本数 (= AREA_Y / GRID_DISTANCE + 1)
#const CAR_SIZE 12      // 車の長さ
#const CAM_DISTANCE 15.0// カメラと車の距離
#const CAM_MODE_MAX 7   // カメラモードの数
 
*init
    buffer 1, AREA_X, AREA_Y
    screen 0, AREA_X, AREA_Y * 2, 0
    gmode 0, AREA_X, AREA_Y
    title "3Dカメラワーク - 平面レースゲームの場合"
 
    carX = 10.0 : carY = 10.0 : carZ = 0.0      // 車の座標
    carT = PI / 4                               // 車の向き
    carSpeed = 0.0                              // 車のスピード
    camX = 0.0 : camY = 0.0 : camZ = 20.0       // カメラの座標
    camT = carT                                 // カメラの向き
    needToDraw = 1                              // 描画し直す必要性がある場合は1
 
    camMode = 0     // カメラのモード
                    //   0 ... ぴったりと後方について回る
                    //   1 ... カメラを棒で牽引
                    //   2 ... 常に同じ方向から見る
                    //   3 ... ほぼ真上から見る
                    //   4 ... 常に同じ位置から見る
                    //   5 ... カメラが常に旋回
                    //   6 ... カメラをゴムで牽引(実際にはカメラの現在位置とcamMode1の位置を1:3に内分する点)
 
*main
    gosub *move     // 車とカメラの移動
    gosub *draw     // 車とグリッド、全体マップの描画
    await 16
    goto *main
 
*move
    stick key, 15
    if key & 16 {
        // [Space]キーでカメラアングル変更
        camMode = (camMode + 1) \ CAM_MODE_MAX
        needToDraw = 1
    }
    gosub *moveCar  // 車の移動
    gosub *moveCam  // カメラの移動
    return
 
*moveCar
    carSpeed = limitf(carSpeed + 0.1*((key & 2) - 1), 0.0, 3.0) // ↑を押せば加速、押さなければ減速
    if carSpeed > 0.0 {
        carT += 0.1*((key & 1) - (key >> 2 & 1))
        carX = limitf(carX + carSpeed * cos(carT), 0, AREA_X)
        carY = limitf(carY + carSpeed * sin(carT), 0, AREA_Y)
        needToDraw = 1  // 車が移動したので画面を描画し直す必要がある
    }
    return
 
*moveCam
    switch camMode
    case 1          // 棒で牽引
        camT = atan(camY - carY, camX - carX)
        camX = carX + cos(camT) * CAM_DISTANCE
        camY = carY + sin(camT) * CAM_DISTANCE
        swbreak
    case 2          // 常に同じ方向から
        camT = PI * 3 / 2
        camX = carX + cos(camT) * CAM_DISTANCE
        camY = carY + sin(camT) * CAM_DISTANCE
        swbreak
    case 3          // ほぼ真上から(d3moduleの制限で真上ではない)
        camT = PI * 3 / 2
        camX = carX + cos(camT) * 5
        camY = carY + sin(camT) * 5
        swbreak
    case 4          // 常に同じ位置から
        camX = AREA_X / 2
        camY = AREA_Y / 2
        swbreak
    case 5          // 旋回する
        camT -= 0.03
        if camT < 0 : camT += PI * 2
        camX = carX + cos(camT) * CAM_DISTANCE
        camY = carY + sin(camT) * CAM_DISTANCE
        needToDraw = 1
        swbreak
    case 6          // ゴムで牽引
        camT = atan(camY - carY, camX - carX)
        camX = (carX + cos(camT) * CAM_DISTANCE + camX * 3) / 4
        camY = (carY + sin(camT) * CAM_DISTANCE + camY * 3) / 4
        swbreak
    default         // 後方について回る
        camT = carT + PI
        camX = carX + cos(camT) * CAM_DISTANCE
        camY = carY + sin(camT) * CAM_DISTANCE
        swbreak
    swend
    gsel 1
    d3setcam camX, camY, camZ, carX, carY, carZ, 2
    return
 
*draw
    if needToDraw == 0 : return
    gsel 1
    gosub *drawBuf
    gsel 0
    gosub *drawScr
    if carSpeed == 0.0 : needToDraw = 0
    return
 
*drawBuf
    color : boxf
    gosub *drawBufGrid  // バッファにグリッドを描画
    gosub *drawBufCar   // バッファに車を描画
    return
 
*drawBufGrid
    color 0, 0, 255
    repeat 9, int(carY / GRID_DISTANCE) - 4
        if (cnt < 0)|(GRID_NUM_X <= cnt) : continue
        y = cnt * GRID_DISTANCE
        repeat 9, int(carX / GRID_DISTANCE) - 4
            if (cnt < 0)|(GRID_NUM_Y <= cnt) : continue
            x = cnt * GRID_DISTANCE
            d3line x, 0, 0, x, AREA_Y, 0
            d3line 0, y, 0, AREA_X, y, 0
        loop
    loop
    return
 
*drawBufCar
    color 255
    d3initlineto
    d3lineto carX, carY, carZ
    d3lineto carX - cos(carT + 0.2) * CAR_SIZE, carY - sin(carT + 0.2) * CAR_SIZE, carZ
    d3lineto carX - cos(carT - 0.2) * CAR_SIZE, carY - sin(carT - 0.2) * CAR_SIZE, carZ
    d3lineto carX, carY, carZ
    return
 
*drawScr
    redraw 0
    gosub *drawScrMap
    pos 0, 320
    gcopy 1, 0, 0       // 3D表示をコピー
    redraw 1
    return
 
*drawScrMap
    color : boxf 0, 0, 320, 320
    gosub *drawScrMapGrid
    gosub *drawScrMapCar
    gosub *drawScrMapCam
    return
 
// グリッドを描く
*drawScrMapGrid
    color 0, 0, 255
    repeat GRID_NUM_Y
        y = cnt * GRID_DISTANCE
        repeat GRID_NUM_X
            x = cnt * GRID_DISTANCE
            line x, 0, x, AREA_Y
            line 0, y, AREA_X, y
        loop
    loop
    return
 
// 車の位置を表示
*drawScrMapCar
    color 255
    pos carX, AREA_Y - carY
    line carX - cos(carT + 0.2) * CAR_SIZE, AREA_Y - (carY - sin(carT + 0.2) * CAR_SIZE)
    line carX - cos(carT - 0.2) * CAR_SIZE, AREA_Y - (carY - sin(carT - 0.2) * CAR_SIZE)
    line carX, AREA_Y - carY
    return
 
// カメラの位置を表示
*drawScrMapCam
    color 0, 255
    circle camX - 2, - camY + 2 + AREA_Y, camX + 2, - camY - 2 + AREA_Y
    return

コメント

  • Easy3Dユーザーの間では研究が盛んなようです。あっちはアクション系が多いですからね。私のところでも少し研究中です。Easy3D用ですがサンプル。レース用に移殖すれば面白いかもしれません。上下運動がなければ3D酔いも抑えられると思いますし。 -- GENKI? 2007-05-10 (木) 22:40:34
  • と思ったてたらcamMode=1がまさにこれでしたね。(^_^; すみません、あんまりよく見てませんでした。しかし、camMode = 4は操作しにくいですけど一番迫力ありますね。 -- GENKI? 2007-05-10 (木) 22:47:02
  • >camMode = 4は操作しにくいですけど...レース中は使えなさそうですけど、リプレイとかには使えそうですね。昔の(今のは知らない)マリオカ○トのようにゴール後の映像で使ってもいいかも知れません。
    それと、camMode = 5(旋回するカメラ)を追加しました。これも操作が難しので、リプレイ向きかも知れません。-- eller 2007-05-11 (金) 07:10:00
  • ゴムで牽引(と見せかける内分点)を追加。速度に応じてカメラとの距離が変わるので、よりスピード感が味わえます。 -- eller 2007-05-12 (土) 09:52:35
  • めちゃくちゃ参考になりました。 -- dd? 2011-12-07 (水) 17:57:39

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2011-12-07 (水) 17:57:39 (731d)