siv3dで楽しむゲームとメディアアート開発

71

Upload: ryo-suzuki

Post on 25-Jul-2015

1.249 views

Category:

Technology


2 download

TRANSCRIPT

Page 2: Siv3Dで楽しむゲームとメディアアート開発

お絵かきアプリを作りたい!

Page 3: Siv3Dで楽しむゲームとメディアアート開発

Kinect のゲームってどうやって作るの?

http://news.microsoft.com/wp-content/uploads/2014/04/KinectforWindowsv2_03_Web.png

Page 4: Siv3Dで楽しむゲームとメディアアート開発

子供も楽しめるプログラミングツールを教えて!

Page 5: Siv3Dで楽しむゲームとメディアアート開発

# include <Siv3D.hpp>

void Main(){

Image image(640, 480, Palette::White);

DynamicTexture texture(image);

while (System::Update()){

if (Input::MouseL.pressed){

auto pos = Input::MouseL.clicked ? Mouse::Pos(): Mouse::PreviousPos();

Line(pos, Mouse::Pos()).write(image, 8, Palette::Blue);

texture.fill(image);}

texture.draw();}

}

Page 6: Siv3Dで楽しむゲームとメディアアート開発

# include <Siv3D.hpp>

void Main(){

Image image(640, 480, Palette::White);

DynamicTexture texture(image);

while (System::Update()){

if (Input::MouseL.pressed){

auto pos = Input::MouseL.clicked ? Mouse::Pos(): Mouse::PreviousPos();

Line(pos, Mouse::Pos()).write(image, 8, Palette::Blue);

texture.fill(image);}

texture.draw();}

}

Page 7: Siv3Dで楽しむゲームとメディアアート開発

# include <Siv3D.hpp>

void Main(){

KinectV2::Start();DynamicTexture depthTexture;std::array<Optional<KinectV2Body>, 6> bodies;

while (System::Update()){

if (KinectV2::HasNewDepthFrame())KinectV2::GetDepthFrame(depthTexture);

if (KinectV2::HasNewBodyFrame())KinectV2::GetBodyFrame(bodies);

depthTexture.draw(0, 0);

for (const auto& body : bodies)if (body)

for (const auto& joint : body->joints)Circle(joint.depthSpacePos,15).drawFrame(6,0,Palette::Red);

}}

Page 8: Siv3Dで楽しむゲームとメディアアート開発

# include <Siv3D.hpp>

void Main(){

KinectV2::Start();DynamicTexture depthTexture;std::array<Optional<KinectV2Body>, 6> bodies;

while (System::Update()){

if (KinectV2::HasNewDepthFrame())KinectV2::GetDepthFrame(depthTexture);

if (KinectV2::HasNewBodyFrame())KinectV2::GetBodyFrame(bodies);

depthTexture.draw(0, 0);

for (const auto& body : bodies)if (body)

for (const auto& joint : body->joints)Circle(joint.depthSpacePos,15).drawFrame(6,0,Palette::Red);

}}

Page 9: Siv3Dで楽しむゲームとメディアアート開発

# include <Siv3D.hpp>void Main() {

const Size blockSize(40, 20);const double speed = 8.0;Rect wall(60, 10);Circle ball(320, 400, 8);Vec2 ballSpeed(0, -speed);Array<Rect> blocks;for (auto p : step({ Window::Width() / blockSize.x, 5 }))

blocks.emplace_back((p*blockSize).moveBy(0, 60), blockSize);

while (System::Update()) {ball.moveBy(ballSpeed);wall.setCenter(Mouse::Pos().x, 420);

for (auto it = blocks.begin(); it != blocks.end(); ++it)if (it->intersects(ball)) {

(it->bottom.intersects(ball) || it->top.intersects(ball) ? ballSpeed.y : ballSpeed.x) *= -1;blocks.erase(it);break;

}

for (const auto& block : blocks)block.stretched(-1).draw(HSV(block.y - 40));

if (ball.y<0 && ballSpeed.y<0)ballSpeed.y *= -1;

if ((ball.x < 0 && ballSpeed.x < 0) || (Window::Width() < ball.x && ballSpeed.x > 0))ballSpeed.x *= -1;

if (ballSpeed.y>0 && wall.intersects(ball))ballSpeed = Vec2((ball.x - wall.center.x) / 8, -ballSpeed.y).normalized()*speed;

ball.draw();wall.draw();

}}

Page 10: Siv3Dで楽しむゲームとメディアアート開発

# include <Siv3D.hpp>void Main() {

const Size blockSize(40, 20);const double speed = 8.0;Rect wall(60, 10);Circle ball(320, 400, 8);Vec2 ballSpeed(0, -speed);Array<Rect> blocks;for (auto p : step({ Window::Width() / blockSize.x, 5 }))

blocks.emplace_back((p*blockSize).moveBy(0, 60), blockSize);

while (System::Update()) {ball.moveBy(ballSpeed);wall.setCenter(Mouse::Pos().x, 420);

for (auto it = blocks.begin(); it != blocks.end(); ++it)if (it->intersects(ball)) {

(it->bottom.intersects(ball) || it->top.intersects(ball) ? ballSpeed.y : ballSpeed.x) *= -1;blocks.erase(it);break;

}

for (const auto& block : blocks)block.stretched(-1).draw(HSV(block.y - 40));

if (ball.y<0 && ballSpeed.y<0)ballSpeed.y *= -1;

if ((ball.x < 0 && ballSpeed.x < 0) || (Window::Width() < ball.x && ballSpeed.x > 0))ballSpeed.x *= -1;

if (ballSpeed.y>0 && wall.intersects(ball))ballSpeed = Vec2((ball.x - wall.center.x) / 8, -ballSpeed.y).normalized()*speed;

ball.draw();wall.draw();

}}

Page 11: Siv3Dで楽しむゲームとメディアアート開発

C++ で 楽しく簡単にゲームやメディアアートを開発できるライブラリSiv3D を紹介 + 解説

Page 12: Siv3Dで楽しむゲームとメディアアート開発

自己紹介鈴木 遼(早稲田大学 表現工学専攻 修士 2 年)

2008 年から Siv3D を開発

「ゲーム開発者のための C++11/C++14」

Page 13: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 14: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 15: Siv3Dで楽しむゲームとメディアアート開発

画像や音や入出力デバイスを使って楽しいもの、表現的なものを作ろう!

有名なツール:Processing, openFrameworks, Cinder

Creative Coding

Page 16: Siv3Dで楽しむゲームとメディアアート開発

ほかには・・・

11 行 でイラストから 顔検出

26 行 で Twitter クライアント

38 行 で 音楽プレイヤー

短いコード

Page 17: Siv3Dで楽しむゲームとメディアアート開発

こんな人に便利学習プログラミングを教えている / 学んでいる人

ゲーム趣味でゲーム開発をしている人

メディアアートメディアアートを制作している人

ビジュアライゼーション研究でプログラムを書いている人

Page 18: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 19: Siv3Dで楽しむゲームとメディアアート開発

音や画像に関する低レイヤ~高レイヤの様々な機能を組み合わせて新しいアイデアを生み出せる

Page 20: Siv3Dで楽しむゲームとメディアアート開発

音楽と音声の処理 [1/3]

サウンドの再生コントロール再生, 一時停止, 音量 & スピード変更, 多重再生,再生位置取得 & 変更・フェードイン/アウト

録音マイクの録音データを波形データとして取得

5 種類のフォーマットをサポートWAVE, OggVorbis, MP3, AAC, WMAの読み込みと保存に対応

Page 21: Siv3Dで楽しむゲームとメディアアート開発

音楽と音声の処理 [2/3]

FFT (音の高さの解析)録音や再生している音声の周波数解析をリアルタイムに実行できる

波形生成プログラムの計算で波形データを作成できる

ピッチシフト & タイムストレッチサウンドの音の高さやテンポを再生しながら変更できる

Page 22: Siv3Dで楽しむゲームとメディアアート開発

音楽と音声の処理 [3/3]

拍のカウントBPM を指定すると拍のカウントを自動で計算してくれる

MIDIMIDI ファイルを再生したり、MIDI メッセージをプログラムで直接送信して音を鳴らせる

音の方向推定音が鳴った方向を推定する機能(Kinevt v2)

Page 23: Siv3Dで楽しむゲームとメディアアート開発

デモ: 音声処理を活用するユーザ作品http://www.nicovideo.jp/watch/sm22665548

Page 24: Siv3Dで楽しむゲームとメディアアート開発

CGと画像処理 [1/3]

2D CG レンダリング図形や画像、テキストを画面に描く

3D CG レンダリング3D 形状や 3D モデルを画面に描く

・Deferred Rendering・最大 128 光源

Page 25: Siv3Dで楽しむゲームとメディアアート開発

CGと画像処理 [2/3]

画像処理ガウスぼかし、輪郭検出、フィルター、加工等ピクセル単位の処理もできる

10 種類のフォーマットに対応PNG, JPEG, BMP, TIFF, GIF, TGA, DDS, WebP, JPEG2000, PPM, の読み込みと保存に対応

Web カメラ画像取得PC のカメラの映像を使った処理ができる

Page 26: Siv3Dで楽しむゲームとメディアアート開発

CGと画像処理 [3/3]

AR マーカー / QR コード検出カメラの映像から AR マーカーやQR コードの情報を取得できる

顔の検出写真やカメラの映像、イラストから人間の顔を検出できる

画像に厚みを持たせて 3D モデル生成画像に形状を描けば、それに厚みを持たせて3D モデルを生成できる

Page 27: Siv3Dで楽しむゲームとメディアアート開発

音や画像に関する低レイヤ~高レイヤの様々な機能を組み合わせて新しいアイデアを生み出せる

まとめ

Page 28: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 29: Siv3Dで楽しむゲームとメディアアート開発

12 種類の入力デバイスに対応コードを 2, 3 行追加すればすぐにアプリで活用できる

Page 30: Siv3Dで楽しむゲームとメディアアート開発

対応デバイス [1/3]

Page 31: Siv3Dで楽しむゲームとメディアアート開発

対応デバイス [2/3]

Page 32: Siv3Dで楽しむゲームとメディアアート開発

対応デバイス [3/3]

Page 33: Siv3Dで楽しむゲームとメディアアート開発

12 通りの方法で遊べるブロック崩し[117行]

• AR マーカーを持ってカメラの前で左右に移動

• Kinect を傾けて三軸加速度センサの値を取得

• 口笛を吹くとその音の高さの場所にバーが移動

Page 34: Siv3Dで楽しむゲームとメディアアート開発

Demo: 12通りの方法で遊べるブロック崩し

Page 35: Siv3Dで楽しむゲームとメディアアート開発

12 種類の入力デバイスに対応コードを 2, 3 行追加すればすぐにアプリで活用できる

まとめ

Page 36: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 37: Siv3Dで楽しむゲームとメディアアート開発

音や画像を使うユニークな作品が生み出されている。教育での活用事例もある

Page 38: Siv3Dで楽しむゲームとメディアアート開発
Page 39: Siv3Dで楽しむゲームとメディアアート開発

HamSketch http://www.nicovideo.jp/watch/sm23493878

手描き風イラスト生成

Page 40: Siv3Dで楽しむゲームとメディアアート開発

曲と連動するタイピングソフトTYPL http://www.nicovideo.jp/watch/sm25640453

Page 41: Siv3Dで楽しむゲームとメディアアート開発

教育での活用事例早稲田大学の中高生向け IT 講座

情報科学を学ぶデジタル教材と・プログラミング講座に採用

ゲーム専門学校(香川)

1 年生向けの C++ の授業で教材として採用

http://www.anabuki-college.net/ack/news.cgi?Snumber=4162

Page 42: Siv3Dで楽しむゲームとメディアアート開発

Siv3D への声ユニティ・テクノロジーズ・ジャパン簗瀬 洋平さん

openFrameworksコミュニティマネージャーKyle McDonald さん

Page 43: Siv3Dで楽しむゲームとメディアアート開発

音や画像を使うユニークな作品が生み出されている。教育での活用事例もある

まとめ

Page 44: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 45: Siv3Dで楽しむゲームとメディアアート開発

C++11/14 規格に積極対応複雑な表現やインタラクションを短く明快なコードで実現

Page 46: Siv3Dで楽しむゲームとメディアアート開発

Variadic templates

Println(L"Hello, world!", 12345, L"!!!");

// Hello, world!12345!!!

Println(PyFmt, L"{2}/{1}/{0}", 2015, 5, 31);

// 31/5/2015

C++ Advent Calendar 201417 日目で紹介されているcppformat というライブラリを使用

Page 47: Siv3Dで楽しむゲームとメディアアート開発

ラムダ式

Array<Vec2> bullets;

...

Erase_if(bullets,

[](const Vec2& v) { return v.y > 500; });

KinectV2::GetDepthFrame(texture,

[](uint16 d){ return HSV(d / 4); });

Page 48: Siv3Dで楽しむゲームとメディアアート開発

Initializer list

const Vec2 pts[6] =

{

{ 50, 50 }, { 350, 50 }, { 350, 350 },

{ 200, 350 }, { 200, 200 }, { 50, 200 }

};

const Polygon polygon(pts);

polygon.draw(Color(92, 230, 138));

Page 49: Siv3Dで楽しむゲームとメディアアート開発

Initializer list

const Polygon polygon

{

{ 50, 50 }, { 350, 50 }, { 350, 350 },

{ 200, 350 }, { 200, 200 }, { 50, 200 }

};

polygon.draw({ 92, 230, 138 });

Page 50: Siv3Dで楽しむゲームとメディアアート開発

for ループのユーティリティ

for (auto i : step(5))

{

Println(i);

}

// 0 1 2 3 4

for (auto p : step({ 6, 4 }))

{

Rect(p.x * 50 , p.y * 30, 40, 20).draw();

}

詳しい実装: http://www.codeproject.com/Articles/876156/Convenient-Constructs-For-Stepping-Through-a-Range

Page 51: Siv3Dで楽しむゲームとメディアアート開発

BoostTokenizerCSV ファイルの読み込みで利用

Geometry多角形の幾何計算と一部の交差判定で利用

(Random)→ 標準ライブラリに入ったので不要に

(Optional) → コンパイルが重くなるため自前実装

(Visual Studio 向けに)

Page 52: Siv3Dで楽しむゲームとメディアアート開発

サンプルコードが最新の C++

ライブラリコードだけでなく、公式サイトのサンプルやリファレンスもすべてモダンな C++ で書かれている

スマートポインタ、nullptr, enum class, 乱数ライブラリ、正規表現、unordered_map, auto, ムーブ、初期化リスト、Emplacement,Alias template, 可変長引数テンプレート…

Siv3D で遊ぶと、自然に新しい C++ のコーディングに慣れる!

Page 53: Siv3Dで楽しむゲームとメディアアート開発

C++11/14 規格に積極対応複雑な表現やインタラクションを短く明快なコードで実現

まとめ

Page 54: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 55: Siv3Dで楽しむゲームとメディアアート開発

ゲーム開発に便利な機能を多数実装

Page 56: Siv3Dで楽しむゲームとメディアアート開発

便利な機能の例 [1/4]

あらゆる図形同士のあたり判定円、線分、四角形、多角形、あらゆる図形同士の高速な交差判定や包含判定

標準 GUIボタンやスライダー、ラジオボタンなどの基本的な GUI を標準で提供

アセットのリロード実行中に画像ファイルや音声ファイルを更新した場合、再起動せず即座に反映できる

Page 57: Siv3Dで楽しむゲームとメディアアート開発

便利な機能の例 [2/4]

スクショ・プレイムービーの保存スクリーンショットやムービーを保存することができる

ファイルのアーカイブ・データの暗号化複数のファイルをまとめたり、データに暗号 (AES-128bit) をかけて保護したりできる

シーン遷移シーンの遷移を簡単に記述できるC++ フレームワークを用意

Page 58: Siv3Dで楽しむゲームとメディアアート開発

便利な機能の例 [3/4]

BGM のフェードイン/フェードアウト時間を指定して BGM の再生や停止にフェードイン/フェードアウトを適用できる

INI, JSON, CSV, XML の読み書きデータ記述言語を多数サポートゲームのデータの保存や読み込みに活用できる

ファイルのダウンロード指定した URL からファイルをバックグラウンドでダウンロードできる

Page 59: Siv3Dで楽しむゲームとメディアアート開発

便利な機能の例 [4/4]

Draw call 取得描画のボトルネックを見つけるために、Draw call の発行回数を取得可能

起動時のロゴ表示起動時にオリジナルのロゴを表示できる

キーコンフィグキーやゲームコントローラのボタンを組み合わせて新しいキーを定義でき、キーコンフィグが簡単に

Page 60: Siv3Dで楽しむゲームとメディアアート開発

ゲーム開発に便利な機能を多数実装

まとめ

Page 61: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 62: Siv3Dで楽しむゲームとメディアアート開発

デモのコード

play-siv3d.hateblo.jp/entry/boost17

play-siv3d.hateblo.jp/entry/zengeren17

Page 63: Siv3Dで楽しむゲームとメディアアート開発

まとめ

Page 64: Siv3Dで楽しむゲームとメディアアート開発

• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ

Page 65: Siv3Dで楽しむゲームとメディアアート開発
Page 66: Siv3Dで楽しむゲームとメディアアート開発
Page 67: Siv3Dで楽しむゲームとメディアアート開発
Page 68: Siv3Dで楽しむゲームとメディアアート開発

Array<Vec2> bullets;

...

Erase_if(bullets,

[](const Vec2& v) { return v.y > 500; });

Println(PyFmt, L”{2}/{1}/{0}”, 2015, 5, 31);

for (auto i : step(5))

{

Println(i);

}

Page 69: Siv3Dで楽しむゲームとメディアアート開発

あらゆる図形同士のあたり判定

標準 GUI

アセットのリロード

スクショ・プレイムービーの保存

ファイルのアーカイブ・データの暗号化

シーン遷移

BGM のフェードイン/フェードアウト

INI, JSON, CSV, XML の読み書き

ファイルのダウンロード

Draw call 取得

起動時のロゴ表示

キーコンフィグ

Page 70: Siv3Dで楽しむゲームとメディアアート開発

学習プログラミングを教えている / 学んでいる人

ゲーム趣味でゲーム開発をしている人

メディアアートメディアアートを制作している人

ビジュアライゼーション研究用のプログラムを書いている人

Page 71: Siv3Dで楽しむゲームとメディアアート開発

Web サイトplay-siv3d.hateblo.jp

Question?• Siv3D とは

• 音や画像を面白く

• 12 種類の入力デバイスに対応

• ユニークなユーザ作品

• C++11/14 の活用

• ゲーム開発に便利な機能

• デモ