パーティクルッピー


KumaMCN唯一?のガチ勢、ガチ本です。
クラッピーチャレンジ Advent Calendar 2017 24日目の記事です!

メリークリスマス(イブ)!楽しんでるかいパーリーピーポーw卍

遅くなってすみません。ガチ腹痛で倒れておりました…何食べたかなクラッピー

今回は、クラッピーでノリノリになれるインタラクティブなアート&VJパーリーに持って来いなものを2分で作った件についてです。

つくると3!の夜のVJで、みんなで光るクラッピーを持って踊ったのが楽しすぎて…
それからというものKumaMCNはクラッピーの光モノを量産し、流行らせました。(手だけ欲しい…)


作り方

今回用いるのは、クラッピーチャレンジャーまこらぎさんが作ったクラッピーでスライド送り(Digisparkが埋め込んであり、拍手するとEnterキーを送信できる)とSiv3Dを用いてパーティクルを表示します!

  • Windows 10
  • Visual Studio 2017
  • Siv3D
  • プロジェクター
  • DJ
  • クラッピーでスライド送り

Siv3Dは、C++で簡単にゲームやメディアアートアプリが作れるライブラリです。
Kinectなどのセンサーにも対応しています。
Kinectとスラックラインのコラボした際にも活用しました!

今回、参考にしたソースコードはこちら
ソースコードを次のように編集し、拍手のタイミングでEnterキーが送信され、パーティクルが大きくなるように可視化しました。

# include <Siv3D.hpp>

void Main()
{
    Graphics::SetBackground(Color(20, 40, 60));
    Graphics3D::SetLight(0, Light::None());

    const Texture textureGrass(L"Example/Grass.jpg", TextureDesc::For3D);

    Array<Particle> particles(400);

    // フルスクリーン可能な解像度一覧を取得
    const Array<Size> resolutions = Graphics::GetFullScreenSize();

    for (auto& particle : particles)
    {
        const Vec3 pos = RandomVec3({ -20, 20 }, { -0.2, 4 }, { -20, 20 });

        particle = Particle(pos, 0.2, ColorF(1.0, 0.6, 0.0));
    }

    const Texture texture(L"Example/Particle.png", TextureDesc::For3D);

    Graphics3D::SetBlendStateForward(BlendState::Additive);
    Graphics3D::SetDepthStateForward(DepthState::TestOnly);
    bool enterFlag = false;

    const Size targetSize(1280, 720);

    while (System::Update())
    {
        if (Input::KeyF.clicked)
        {
            // フルスクリーンモード
            if (!Window::SetFullscreen(true, targetSize))
            {
                System::Exit();
            }
        }

        if (Input::KeyW.clicked)
        {
            // ウィンドウモード
            if (!Window::SetFullscreen(false, targetSize))
            {
                System::Exit();
            }
        }
        Graphics3D::FreeCamera();

        if ((Input::KeyEnter).pressed) {
            enterFlag = true;
        }
        else {
            enterFlag = false;
        }

        for (auto& particle : particles)
        {
            particle.pos.y += 0.01f;

            if (4.0 < particle.pos.y)
            {
                particle.pos.y -= 4.2f;
            }

            const ColorF color = HSV(particle.pos.y * 100.0);

            const float s = 1.0f - (Abs(2.0f - particle.pos.y) / 2.0f);
            if(enterFlag){
                particle.scaling.x = particle.scaling.y = 1.0f * s;
            }
            else {
                particle.scaling.x = particle.scaling.y = 0.2f * s;
            }

            particle.color.w = s;
            particle.color = Vector4D<float>(color.b, color.g, color.r, color.a);

        }

        Plane(40).draw(textureGrass);

        Graphics3D::DrawParticlesForward(particles, texture);
    }
}

結果

スライド送りクラッピーを接続して、実行すると…

インタラクションでもクラッピー、「パーティクルッピー」でした。

クラッピーでパーリーしたいやつらはKumaMCNについてこい!卍卍