H1rono / physical-simulation

Processing (Java)で物理シミュレーション
MIT License
0 stars 0 forks source link

Floorオブジェクト #3

Closed H1rono closed 3 years ago

H1rono commented 3 years ago

「床」のクラス

草案:

final PVector gravity;
final float delta_time;

Floor floor;
Ball ball;

// ballとfloor間で力を交換する(少し修正)
void exchange_force(Ball ball, Floor floor) {
    PVector ball_force = ball.get_force();
    /*  次のように定義する:
        * ballがfloorと衝突する直前の運動量をmomentum
        * ballがfloorから受ける力積をforce * delta_time
        * ballとfloorは弾性衝突する
        このとき、-momentum = force * delta_time + momentum となるから、
        force = -2 * momentum / delta_time */
    // get_momentumでballの運動量を取得
    ball_force.add(ball.get_momentum().div(delta_time).mult(-2));
    // 垂直抗力の大きさはball_forceの鉛直成分
    ball.add_force(new PVector(0, ball_force.y));
} // TODO: 摩擦力

void exchange_force(Floor floor, Ball ball) {
    exchange_force(ball, floor);
}

void setup() {
    size(720, 720);
    gravity = new PVector(0, 9.8);
    delta_time = 0.1;
    floor = new Floor(700 /* height */);
    // y=700のところに床の線が引かれる
    ball = new Ball(
        new PVector(100, 680), // position | 680 = 700 - 20
        new PVector(0, 0), // velocity
        10, // mass
        20 // radius
    );
}

void draw() {
    background(255);
    ball.set_force(gravity.copy().mult(ball.mass));
    if (ball.is_collide(floor)) { // floor.is_collide(ball) でも同じ結果が得られるようにしたい
        exchange_force(ball, floor);
    }
    ball.update(delta_time);
    floor.update(delta_time); // 何もしない
    // 描画
    ball.draw();
    floor.draw();
}
H1rono commented 3 years ago

effect_on()メソッドを実装するのは?

草案:

// 略

void draw() {
    // 略
    if (ball.is_collide(floor)) {
        // Effectクラスは様々な力や力積による「影響」を表す
        // eはfloorからballへの「影響」
        Effect e = floor.effect_on(ball);
        ball.add_effect(e);
    }
    if (floor.is_collide(ball)) {
        // floorがballの「影響」を受け取る
        Effect e = ball.effect_on(floor);
        floor.add_effect(e);
    }
    // ここで「影響」を速度などに反映させる
    ball.update(delta_time);
    floor.update(delta_time);
    // 略
}

Effectクラス:

class Effect {
    // 力、力積
    // delta_timeが決定するまで力積から力は求まらないため、力積のみ別に持つ
    public PVector force, impulse;

    public Effect(PVector force, PVector impulse) {
        this.force = force
        this.impulse = impulse
    }
}
H1rono commented 3 years ago

4 に以降します。