2007年5月4日金曜日

3次元空間を反射する光線

モジュール変数によるキャラクター管理法。
d3moduleを利用しています。

d3box命令を使って修正。(2007/10/02)
#include "d3m.hsp"
#const global BOX_X    200
#const global BOX_Y    300
#const global BOX_Z    150
#const CAMERA_DISTANCE 500
#const BALL_MAX         30
#module physics3d x, y, z, vx, vy, vz
#modinit double d1, double d2, double d3, double d4, double d5, double d6
    x = d1, d1, d1, d1
    y = d2, d2, d2, d2
    z = d3, d3, d3, d3
    vx = d4 : vy = d5 : vz = d6
    return

#modfunc moveBall
    x(1) = x, x(1), x(2)
    y(1) = y, y(1), y(2)
    z(1) = z, z(1), z(2)
    x += vx : y += vy : z += vz
    if ( x < 0 ) | ( BOX_X < x ) : vx *= -1
    if ( y < 0 ) | ( BOX_Y < y ) : vy *= -1
    if ( z < 0 ) | ( BOX_Z < z ) : vz *= -1
    return

#modfunc drawBall
    d3initlineto
    repeat 4
        d3lineto x(cnt), y(cnt), z(cnt)
    loop
    return
#global

    screen 0400370
    title "3次元を反射する光線"

    theta = 0.0          // カメラの角度 (極座標)
    phi = 3.14 / 2       // カメラの角度2(極座標)
    gosub *setcam
    repeat BALL_MAX
        newmod ball, physics3d, rnd(200), rnd(300), rnd(150), (rnd(9)-4)*3, (rnd(9)-4)*4, (rnd(9)-4)*3
    loop

*main
    gosub *moveCam
    gosub *draw
    wait 4
    goto *main

*moveCam
    stick key, 15
    if key & 15 {
        theta += 0.1*((key & 1) - (key >> 2 & 1))
        phi    = limitf(phi + 0.1*((key >> 1 & 1) - (key >> 3 & 1)), 0.13.13)
            // ↑ カメラのXY座標がターゲットと同じにならないための対策

        gosub *setcam
    }
    return

*draw
    redraw 0
    color : boxf
    hsvcolor 30255100
    d3box 000BOX_XBOX_YBOX_Z
    hsvcolor 30255255
    foreach ball
        moveBall ball(cnt)
        drawBall ball(cnt)
    loop
    redraw
    return

*setcam
    d3setcam sin(phi)*cos(theta)*CAMERA_DISTANCE + 100sin(phi)*sin(theta)*CAMERA_DISTANCE + 150cos(phi)*CAMERA_DISTANCE + 7510015075
    return

0 件のコメント: