SlideShare a Scribd company logo
メディア・アートII 第2回
openFrameworks基礎
配列、くりかえし、乱数
ベクトルを使用したアニメーション
2013年9月16日
多摩美術大学情報デザイン学科メディア芸術コース
田所淳
本日の内容
‣ openFrameworksのプログラムの基礎
‣ 今後の作品制作のための基礎体力をつけていきます!
‣ 乱数(ランダム)
‣ 配列とくりかえし
‣ 条件分岐
‣ ベクトルを使用した運動の表現
‣ 大量の物体を動かす
本日の内容
‣ ただ、プログラミングを書き写すだけではつまらない…
‣ クイズ形式で進めてみます!
準備
‣ まずは、先週の復習
‣ 新規プロジェクトの生成 - ProjectGeneratorの使い方
Q1: 乱数について
Q1: 乱数について
‣ ランダム(規則性のない)場所に、静止した円を描きなさい
‣ プログラムを実行するたびに、違う場所に描かれるように
‣ ヒント:
‣ 円を描く - ofCircle(x, y, radius);
‣ ランダムな数を生成 - ofRandom(min, max);
#include "testApp.h"
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
}
void testApp::update(){
}
void testApp::draw(){
// ランダムな場所に半径40pxの円を描く
ofCircle(ofRandom(ofGetWidth()), ofRandom(ofGetHeight()), 40);
}
... 後略
Q1: 乱数について
‣ よくある間違い - testApp.cpp
‣ どうなるか、実験してみる
Q1: 解答
Q1: 乱数について - 解答
‣ setup() であらかじめランダムな座標を生成しておく
‣ 生成した座標は、グローバルな変数に格納 (testApp.hに)
‣ その変数の値を参照して、draw() で円を描く
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
...
// 円の位置
float posX;
float posY;
};
Q1: 乱数について - 解答
‣ testApp.h
#include "testApp.h"
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
// 画面内のランダムな場所を指定
posX = ofRandom(ofGetWidth());
posY = ofRandom(ofGetHeight());
}
...
void testApp::draw(){
// 設定した場所に円を描く
ofSetHexColor(0x3399cc);
ofCircle(posX, posY, 20);
}
...
Q1: 乱数について - 解答
‣ testApp.cpp
Q1: 乱数について - 解答
‣ 実行するたびに、ランダムな場所に円が描かれる
Q2: たくさんの図形をランダムな場所に描く
Q2: たくさんの図形をランダムな場所に描く
‣ 100個の静止した円をランダムな場所に描く
‣ 半径は40pxで統一
Q2: たくさんの図形をランダムな場所に描く
‣ ヒント 1: 配列 - たくさんの値を保存する
‣ 例えば、100個のposXを保存するための「箱」は以下のように
したら準備できる
‣ この箱には、[] で囲まれた部分に連番でナンバリングされる
‣ この仕組みで、100個の、posXとposYが確保できる
float posX[100];
posX[0]
posX[1]
posX[2]
...
posX[99]
← 0から開始する
← 0∼99までで100個ぶん
Q2: たくさんの図形をランダムな場所に描く
‣ ヒント 2: くりかえし
‣ for文を使用する
‣ 例えば、0∼99の100回くりかえす構文
‣ カウンタ変数 i を賢く利用する
for (int i = 0; i < 100; i++) {
《処理の内容》
}
for (int i = 0; i < 100; i++) {
posX[i] = ????;
posY[i] = ????;
}
Q2: 解答
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
...
// 位置の配列を生成
float posX[100];
float posY[100];
};
Q2: 解答
‣ testApp.h
#include "testApp.h"
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
// 画面内のランダムな場所を円の数だけ指定
for (int i = 0; i < 100; i++) {
posX[i] = ofRandom(ofGetWidth());
posY[i] = ofRandom(ofGetHeight());
}
}
...
void testApp::draw(){
ofSetHexColor(0x3399cc);
// 画面内のランダムな場所を円の数だけ描画
for (int i = 0; i < 100; i++) {
ofCircle(posX[i], posY[i], 20);
}
}
Q2: 解答
‣ testApp.cpp
Q2: 解答
‣ 100個の円が、ランダムな場所に描かれる
Q2: 解答
‣ 参考:
‣ 数を変更したい場合、いろいろ修正箇所あり
‣ 1箇所だけを変更すると、数がすぐに変更できるようにしたい!
‣ testApp.hに、クラスの定数(const)として数を指定する
‣ 正式には、静的メンバ変数による定数
‣ クラスの定数は、以下のような書式になる
‣ 例: 定数「CIRCLE_NUM」を100と定義
static const int 変数名 = 値;
static const int CIRCLE_NUM = 100;
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
...
// 描画する円の数を指定
static const int CIRCLE_NUM = 100;
// 位置の配列を生成
float posX[CIRCLE_NUM];
float posY[CIRCLE_NUM];
};
Q2: 解答
‣ 定数で数を定義バージョン: testApp.h
#include "testApp.h"
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
// 画面内のランダムな場所を円の数だけ指定
for (int i = 0; i < CIRCLE_NUM; i++) {
posX[i] = ofRandom(ofGetWidth());
posY[i] = ofRandom(ofGetHeight());
}
}
...
void testApp::draw(){
ofSetHexColor(0x3399cc);
// 画面内のランダムな場所を円の数だけ描画
for (int i = 0; i < CIRCLE_NUM; i++) {
ofCircle(posX[i], posY[i], 20);
}
}
Q2: 解答
‣ 定数で数を定義バージョン: testApp.cpp
Q2: 解答
‣ 例: 円の数を、100 → 400個に
Q3: たくさんの図形をアニメーション
Q3: たくさんの図形をアニメーション
‣ 次に表示するプログラムを改造して、100個の円が同時に動き
まわるアニメーションにする
‣ 開始位置と、円の移動速度と方向はランダムに
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
...
// 位置
float positionX;
float positionY;
// 速度
float velocityX;
float velocityY;
};
Q3: たくさんの図形をアニメーション
‣ ヒントプログラム: testApp.h
#include "testApp.h"
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
// ランダムな場所と速度を指定
positionX = ofRandom(ofGetWidth());
positionY = ofRandom(ofGetHeight());
velocityX = ofRandom(-10, 10);
velocityY = ofRandom(-10, 10);
}
void testApp::update(){
// 円の座標を更新
positionX += velocityX;
positionY += velocityY;
// 画面からはみ出ないように
if (positionX < 0 || positionX > ofGetWidth()) {
velocityX *= -1;
}
if (positionY < 0 || positionY > ofGetHeight()) {
velocityY *= -1;
}
}
Q3: たくさんの図形をアニメーション
‣ ヒントプログラム: testApp.cpp
void testApp::draw(){
ofSetHexColor(0x3399cc);
// 円を描画
ofCircle(positionX, positionY, 20);
}
Q3: たくさんの図形をアニメーション
‣ ヒントプログラム: testApp.cpp
Q3: たくさんの図形をアニメーション
‣ ヒント: 位置と速度をそれぞれ配列にする
‣ 定数を定義して、数はすぐに変更できるように
‣ static const int CIRCLE_NUM
‣ positionX[CIRCLE_NUM]
‣ positionY[CIRCLE_NUM]
‣ velocity X[CIRCLE_NUM]
‣ velocityY[CIRCLE_NUM]
‣ 最初の位置と速度、座標の変更、描画、すべての処理をくりか
えして100回行う → for文
Q3: 解答
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
...
// 描画する円の数を指定
static const int CIRCLE_NUM = 100;
// 位置の配列を生成
float posX[CIRCLE_NUM];
float posY[CIRCLE_NUM];
// 速度の配列を生成
float speedX[CIRCLE_NUM];
float speedY[CIRCLE_NUM];
};
Q3: 解答
‣ testApp.h
#include "testApp.h"
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
// 画面内のランダムな場所と速度を円の数だけ指定
for (int i = 0; i < CIRCLE_NUM; i++) {
posX[i] = ofRandom(ofGetWidth());
posY[i] = ofRandom(ofGetHeight());
speedX[i] = ofRandom(-10, 10);
speedY[i] = ofRandom(-10, 10);
}
}
void testApp::update(){
// 円の座標を全て更新
for (int i = 0; i < CIRCLE_NUM; i++) {
posX[i] += speedX[i];
posY[i] += speedY[i];
Q3: 解答
‣ testApp.cpp
// 画面からはみ出たらバウンドさせる
if (posX[i] < 0 || posX[i] > ofGetWidth()) {
speedX[i] *= -1;
}
if (posY[i] < 0 || posY[i] > ofGetHeight()) {
speedY[i] *= -1;
}
}
}
//--------------------------------------------------------------
void testApp::draw(){
ofSetHexColor(0x3399cc);
// 画面内のランダムな場所を円の数だけ描画
for (int i = 0; i < CIRCLE_NUM; i++) {
ofCircle(posX[i], posY[i], 20);
}
}
...
Q3: 解答
‣ testApp.cpp
Q3: 解答
‣ 100個の円が、同時に動く(はず!)
ベクトルによる運動の表現
ベクトルによる運動の表現
‣ ここまでの、(x, y)座標それぞれに変数を用意する方法
‣ ビギナー的表現
‣ より運動を表現するための高度な書式をマスターしたい
‣ 「ベクトル (Vector)」を理解する!
ベクトルによる運動の表現
‣ ベクトル = 幾何学的空間における、大きさと向きを持った量
ベクトルによる運動の表現
‣ 例: 原点(0,0)から(2,3)の座標までのベクトル
‣ このベクトルは、OA = (2,3) と記述される
→
ベクトルによる運動の表現
‣ ベクトルは、足し算することができる
‣ 例: a = (-2,3) と b = (4,2) の2つのベクトルを足す
‣ a + b = (-2+4,3+2) = (2,5)
ベクトルによる運動の表現
‣ ベクトルは、引き算も可能
‣ 例: a = (-2, 3) , b = (4, 2)
‣ a - b = (-2-4,3-2) = (-6,1)
ベクトルによる運動の表現
‣ 位置ベクトル
‣ いままで扱ってきた2次元平面の座標 (x, y) は、原点 (0, 0) を始
点としたベクトルと捉えることができる → 位置ベクトル
ベクトルによる運動の表現
‣ 速度ベクトル
‣ 「速度 (velocity)」とは、単位時間あたりの物体の移動の変位
‣ 日常的な「速さ (speed)」と「速度 (velocity)」を区分する
‣ 1フレームごとの座標の変化 = 向きと大きさをもった「速度ベ
クトル」
位置ベクトル a
位置ベクトル b
速度ベクトル
ベクトルによる運動の表現
‣ openFrameworksで、ベクトルを表現
‣ 2次元のベクトルは「ofVec2f」を使用する
‣ 例:位置ベクトルと速度ベクトルの宣言
‣ 「ベクトル名.x」「ベクトル名.y」: ベクトルの、x方向の成分
と y方向の成分をとりだす
‣ 例:位置ベクトルの(x, y)座標を設定する
‣
ofVec2f position; // 位置ベクトルpositionを宣言
ofVec2f velocity; // 速度ベクトルvelocityを宣言
position.x = 100; // 位置ベクトルpositionのx成分を100に
position.y = 100; // 位置ベクトルpositionのx成分を50に
Q4: ベクトルで運動を表現する
Q4: ベクトルで運動を表現する
‣ Q3 で作成した、たくさんの図形を動かすサンプルを、ベクト
ル(ofVec2f)で書き直してみる
‣ ヒント:100個ぶんの位置ベクトルと速度ベクトルは以下のよ
うに宣言される
// 描画する円の数を指定
static const int CIRCLE_NUM = 100;
// 位置ベクトルの配列
ofVec2f position[CIRCLE_NUM];
// 速度ベクトルの配列
ofVec2f velocity[CIRCLE_NUM];
Q4: 解答
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
...
// 描画する円の数を指定
static const int CIRCLE_NUM = 100;
// 位置ベクトルの配列
ofVec2f position[CIRCLE_NUM];
// 速度ベクトルの配列
ofVec2f velocity[CIRCLE_NUM];
};
Q4: 解答
‣ testApp.h
#include "testApp.h"
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
// 画面内のランダムな場所と速度を円の数だけ指定
for (int i = 0; i < CIRCLE_NUM; i++) {
position[i].x = ofRandom(ofGetWidth());
position[i].y = ofRandom(ofGetHeight());
velocity[i].x = ofRandom(-10, 10);
velocity[i].y = ofRandom(-10, 10);
}
}
void testApp::update(){
// 円の座標を全て更新
for (int i = 0; i < CIRCLE_NUM; i++) {
position[i] += velocity[i];
// 画面からはみ出たらバウンドさせる
if (position[i].x < 0 || position[i].x > ofGetWidth()) {
velocity[i].x *= -1;
}
Q4: 解答
‣ testApp.cpp
if (position[i].y < 0 || position[i].y > ofGetHeight()) {
velocity[i].y *= -1;
}
}
}
void testApp::draw(){
ofSetHexColor(0x3399cc);
// 画面内のランダムな場所を円の数だけ描画
for (int i = 0; i < CIRCLE_NUM; i++) {
ofCircle(position[i], 20);
}
}
Q4: 解答
‣ testApp.cpp
Q4: 解答
‣ おなじ運動が、とてもすっきりと記述できた!!
応用: さらにリアルな運動の表現
摩擦力
応用: さらにリアルな運動の表現
‣ 摩擦力 (Friction) を表現してみる
‣ 摩擦力 = その物体の進行方向逆向きに働く力
速度ベクトル
摩擦力
応用: さらにリアルな運動の表現
‣ 摩擦力を加えた運動の計算アルゴリズム
円の位置と初期速度を設定
力をリセット
摩擦力を加味した力を更新
力から速度を計算、座標を更新
画面からはみ出ていないかチェック
応用: さらにリアルな運動の表現
‣ プログラムの可読性を高める工夫
‣ 処理のかたまりを「関数 (function) 」としてまとめる
応用: さらにリアルな運動の表現
‣ 関数 (function)
‣ 引数 (ひきすう, argument) - 関数に渡す値 (入力)
‣ 返り値 (return value) - 関数が返す値 (出力)
関数
引数1 引数2 引数3
戻り値
応用: さらにリアルな運動の表現
‣ C++での関数の書き方
‣ 例えば、int型の数の二乗を計算する関数
‣ もし戻り値がない関数の場合、戻り値の型は「void」にする
戻り値の型 名前空間::関数名(引数1, 引数2, 引数3...){
関数の処理の内容
}
int testApp::poweroftwo(int a){
! return a * a;
}
応用: さらにリアルな運動の表現
‣ 先程の処理の流れを以下の関数として定義
void setInit();
void resetForce();
void updateForce();
void updatePos();
void checkBounds();
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
...
void setInit(); // 初期設定
void resetForce(); // 力をリセット
void updateForce(); // 力を更新
void updatePos(); // 位置の更新
void checkBounds(); // 画面からはみ出たらバウンドさせる
static const int CIRCLE_NUM = 100; // 描画する円の数を指定
ofVec2f position[CIRCLE_NUM]; // 位置ベクトルの配列
ofVec2f velocity[CIRCLE_NUM]; // 速度ベクトルの配列
ofVec2f force[CIRCLE_NUM]; // 力ベクトルの配列
float friction = 0.01; // 摩擦係数
};
応用: さらにリアルな運動の表現
‣ testApp.h
...
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
setInit(); // 円を初期化
}
void testApp::update(){
resetForce(); // 力をリセット
updateForce(); // 力の更新 (摩擦)
updatePos(); // 円の座標を全て更新
checkBounds(); // 画面からはみ出たらバウンドさせる
}
void testApp::draw(){
ofSetHexColor(0x3399cc);
// 画面内のランダムな場所を円の数だけ描画
for (int i = 0; i < CIRCLE_NUM; i++) {
ofCircle(position[i], 20);
}
}
応用: さらにリアルな運動の表現
‣ testApp.cpp
void testApp::setInit(){
// 画面内のランダムな場所と速度を円の数だけ指定
for (int i = 0; i < CIRCLE_NUM; i++) {
position[i].x = ofGetWidth()/2;
position[i].y = ofGetHeight()/2;
velocity[i].set(ofRandom(-30, 30), ofRandom(-30, 30));
force[i].set(0, 0);
}
}
void testApp::resetForce(){
// 力をリセット
for (int i = 0; i < CIRCLE_NUM; i++) {
force[i].set(0, 0);
}
}
void testApp::updateForce(){
// 力の更新 (摩擦)
for (int i = 0; i < CIRCLE_NUM; i++) {
force[i] = force[i] - velocity[i] * friction;
}
}
応用: さらにリアルな運動の表現
‣ testApp.cpp
void testApp::updatePos(){
// 円の座標を全て更新
for (int i = 0; i < CIRCLE_NUM; i++) {
velocity[i] += force[i];
position[i] += velocity[i];
}
}
void testApp::checkBounds(){
// 画面からはみ出たらバウンドさせる
for (int i = 0; i < CIRCLE_NUM; i++) {
if (position[i].x < 0 || position[i].x > ofGetWidth()) {
velocity[i].x *= -1;
}
if (position[i].y < 0 || position[i].y > ofGetHeight()) {
velocity[i].y *= -1;
}
}
}
応用: さらにリアルな運動の表現
‣ testApp.cpp
応用: さらにリアルな運動の表現
‣ 動きの勢いが、徐々に摩擦で減速していく
応用: さらにリアルな運動の表現
重力
応用: さらにリアルな運動の表現
‣ 重力 (Gravity) を表現してみる
‣ つねに下にむかって、一定の力をかけ続ける
摩擦力
重力
#pragma once
#include "ofMain.h"
class testApp : public ofBaseApp{
public:
...
void setInit(); // 初期設定
void resetForce(); // 力をリセット
void addForce(ofVec2f force); // 力を加える
void updateForce(); // 力を更新
void updatePos(); // 位置の更新
// 画面からはみ出たらバウンドさせる
void checkBounds(float xmin, float ymin, float xmax, float ymax);
// 位置を枠内に収める
void constrain(float xmin, float ymin, float xmax, float ymax);
// 描画する円の数を指定
static const int CIRCLE_NUM = 100;
応用: さらにリアルな運動の表現
‣ testApp.h
// 位置ベクトルの配列
ofVec2f position[CIRCLE_NUM];
// 速度ベクトルの配列
ofVec2f velocity[CIRCLE_NUM];
// 力ベクトルの配列
ofVec2f force[CIRCLE_NUM];
// 摩擦係数
float friction = 0.01;
}
応用: さらにリアルな運動の表現
‣ testApp.h
#include "testApp.h"
void testApp::setup(){
// 画面基本設定
ofSetFrameRate(60);
ofBackground(63);
ofSetCircleResolution(32);
setInit(); // 円を初期化
}
void testApp::update(){
resetForce(); // 力をリセット
addForce(ofVec2f(0, 0.5)); // 重力を加える
updateForce(); // 力の更新 (摩擦)
updatePos(); // 円の座標を全て更新
// 画面からはみ出たらバウンドさせる
checkBounds(0, 0, ofGetWidth(), ofGetHeight());
// 枠内に収める
constrain(0, 0, ofGetWidth(), ofGetHeight());
}
応用: さらにリアルな運動の表現
‣ testApp.cpp
void testApp::draw(){
ofSetHexColor(0x3399cc);
// 画面内のランダムな場所を円の数だけ描画
for (int i = 0; i < CIRCLE_NUM; i++) {
ofCircle(position[i], 20);
}
}
void testApp::setInit(){
// 画面内のランダムな場所と速度を円の数だけ指定
for (int i = 0; i < CIRCLE_NUM; i++) {
position[i].x = ofGetWidth()/2;
position[i].y = ofGetHeight()/2;
velocity[i].set(ofRandom(-30, 30), ofRandom(-30, 30));
force[i].set(0, 0);
}
}
void testApp::resetForce(){
// 力をリセット
for (int i = 0; i < CIRCLE_NUM; i++) {
force[i].set(0, 0);
}
}
応用: さらにリアルな運動の表現
‣ testApp.cpp
void testApp::addForce(ofVec2f _force){
// 力を加える
for (int i = 0; i < CIRCLE_NUM; i++) {
force[i] += _force;
}
}
void testApp::updateForce(){
// 力の更新 (摩擦)
for (int i = 0; i < CIRCLE_NUM; i++) {
force[i] = force[i] - velocity[i] * friction;
}
}
void testApp::updatePos(){
// 円の座標を全て更新
for (int i = 0; i < CIRCLE_NUM; i++) {
velocity[i] += force[i];
position[i] += velocity[i];
}
}
応用: さらにリアルな運動の表現
‣ testApp.cpp
void testApp::constrain(float xmin, float ymin, float xmax, float ymax){
// 枠内に収める
for (int i = 0; i < CIRCLE_NUM; i++) {
if (position[i].x < xmin) {
position[i].x = xmin;
}
if (position[i].y < ymin) {
position[i].y = ymin;
}
if (position[i].x > xmax) {
position[i].x = xmax;
}
if (position[i].y > ymax) {
position[i].y = ymax;
}
}
}
void testApp::checkBounds(float xmin, float ymin, float xmax, float ymax){
// 画面からはみ出たらバウンドさせる
for (int i = 0; i < CIRCLE_NUM; i++) {
if (position[i].x < xmin || position[i].x > xmax) {
velocity[i].x *= -1;
}
応用: さらにリアルな運動の表現
‣ testApp.cpp
if (position[i].y < ymin || position[i].y > ymax) {
velocity[i].y *= -1;
}
}
}
応用: さらにリアルな運動の表現
‣ testApp.cpp
応用: さらにリアルな運動の表現
‣ リアルな運動が再現される
応用: さらにリアルな運動の表現
‣ 数を大量に増やしてみる!
サンプルファイルのダウンロード
‣ 今日は、ここまで!
‣ 全てのサンプルは以下からダウンロードできます
‣ https://github.com/tado/tau_ma2_13

More Related Content

PDF
Media Art II 2013 第5回:openFrameworks Addonを使用する
PDF
Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
PDF
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
PDF
ARコンテンツ作成勉強会 はじめてのKinect openFrameworks編
PDF
メディア・アート II 第1回: ガイダンス openFrameworks入門
PDF
20分くらいでわかった気分になれるC++20コルーチン
PDF
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
PPTX
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
Media Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第4回:openFrameworks アニメーションを極める 動きを生みだす様々なアルゴリズム
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
ARコンテンツ作成勉強会 はじめてのKinect openFrameworks編
メディア・アート II 第1回: ガイダンス openFrameworks入門
20分くらいでわかった気分になれるC++20コルーチン
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unity道場スペシャル 2017博多】クォータニオン完全マスター

What's hot (20)

PDF
Constexpr 中3女子テクニック
PDF
【Unity道場】物理シミュレーション完全マスター
PDF
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
PPTX
大規模ゲーム開発における build 高速化と安定化
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
PDF
【Unity道場 建築スペシャル2】点群ビジュアライゼーション
PDF
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
PDF
Unity2018/2019における最適化事情
PDF
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
PDF
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
PDF
Monad tutorial
PDF
Media Art II openFrameworks 複数のシーンの管理・切替え
PDF
多機能ボイチャを簡単に導入する方法
PDF
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
PDF
Unityでオニオンアーキテクチャ
PPTX
今更C++でiOSアプリを作る話
PDF
NVIDIA GPUで作るHeadless X11 Linux
PDF
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
PDF
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステム
PDF
MagicOnion入門
Constexpr 中3女子テクニック
【Unity道場】物理シミュレーション完全マスター
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
大規模ゲーム開発における build 高速化と安定化
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
【Unity道場 建築スペシャル2】点群ビジュアライゼーション
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Unity2018/2019における最適化事情
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
Monad tutorial
Media Art II openFrameworks 複数のシーンの管理・切替え
多機能ボイチャを簡単に導入する方法
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
Unityでオニオンアーキテクチャ
今更C++でiOSアプリを作る話
NVIDIA GPUで作るHeadless X11 Linux
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステム
MagicOnion入門
Ad

Viewers also liked (16)

PDF
openFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートII
PDF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
PDF
Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
PDF
コンテンツをディレクションするということ
PDF
青年海外協力隊・フィールド調査団の最終報告書
PDF
インターネット広告代理店の「制作ディレクション」というお仕事
PPT
色で失敗しない為に 〜理論に基づく配色フロー〜
PDF
Wo! vol.23 米Coca-Colaサイトにみるコンテンツ・マーケティング
PDF
カヤックコピー部のコピー講座
PDF
分かりやすく、使いやすいデザインを生み出す工夫 先生:池田 拓司
PDF
コンテンツ作りの三原則
KEY
ノンデザイナーのための配色理論
PDF
【プレゼン】見やすいプレゼン資料の作り方【初心者用】
PDF
しょぼいプレゼンをパワポのせいにするな! by @jessedee
PPT
色彩センスのいらない配色講座
PDF
見やすいプレゼン資料の作り方 - リニューアル増量版
openFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートII
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
コンテンツをディレクションするということ
青年海外協力隊・フィールド調査団の最終報告書
インターネット広告代理店の「制作ディレクション」というお仕事
色で失敗しない為に 〜理論に基づく配色フロー〜
Wo! vol.23 米Coca-Colaサイトにみるコンテンツ・マーケティング
カヤックコピー部のコピー講座
分かりやすく、使いやすいデザインを生み出す工夫 先生:池田 拓司
コンテンツ作りの三原則
ノンデザイナーのための配色理論
【プレゼン】見やすいプレゼン資料の作り方【初心者用】
しょぼいプレゼンをパワポのせいにするな! by @jessedee
色彩センスのいらない配色講座
見やすいプレゼン資料の作り方 - リニューアル増量版
Ad

Similar to メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション (20)

PDF
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
PDF
新しい並列for構文のご提案
PDF
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
PDF
Android Lecture #03 @PRO&BSC Inc.
PPTX
UniRxことはじめ
PDF
UnityとBlenderハンズオン第3章
PDF
第12回 配信講義 計算科学技術特論B(2022)
PDF
Java初心者勉強会(2015/08/07)資料
PDF
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
KEY
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PDF
Arduinoでプログラミングに触れてみよう 続編
PDF
Processing
PDF
iTamabi 13 ARTSAT API 実践 5 - 衛星の軌道を描く
PDF
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
PPTX
競技プログラミングのためのC++入門
PDF
P5utda day3
PPTX
ぱっと見でわかるC++11
PDF
Java電卓勉強会資料
PDF
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
PPTX
PBL1-v1-006j.pptx
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
新しい並列for構文のご提案
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
Android Lecture #03 @PRO&BSC Inc.
UniRxことはじめ
UnityとBlenderハンズオン第3章
第12回 配信講義 計算科学技術特論B(2022)
Java初心者勉強会(2015/08/07)資料
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
Arduinoでプログラミングに触れてみよう 続編
Processing
iTamabi 13 ARTSAT API 実践 5 - 衛星の軌道を描く
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
競技プログラミングのためのC++入門
P5utda day3
ぱっと見でわかるC++11
Java電卓勉強会資料
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
PBL1-v1-006j.pptx

More from Atsushi Tadokoro (20)

PDF
「クリエイティブ・ミュージック・コーディング」- オーディオ・ビジュアル作品のための、オープンソースなソフトウエア・フレームワークの現状と展望
PDF
プログラム初級講座 - メディア芸術をはじめよう
PDF
Interactive Music II ProcessingとSuperColliderの連携 -2
PDF
coma Creators session vol.2
PDF
Interactive Music II ProcessingとSuperColliderの連携1
PDF
Interactive Music II Processingによるアニメーション
PDF
Interactive Music II Processing基本
PDF
Interactive Music II SuperCollider応用 2 - SuperColliderとPure Dataの連携
PDF
Media Art II openFrameworks アプリ間の通信とタンジブルなインターフェイス
PDF
Interactive Music II SuperCollider応用 - SuperColliderと OSC (Open Sound Control)
PDF
メディア芸術基礎 II 第11回:HTML5実践 表現のための様々なJavaScriptライブラリ
PDF
芸術情報演習デザイン(Web) 第8回: CSSフレームワークを使う
PDF
Interactive Music II SuperCollider応用 JITLib - ライブコーディング 2
PDF
iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得
PDF
Tamabi media131118
PDF
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
PDF
Interactive Music II SuperCollider応用 JITLib - ライブコーディング 1
PDF
iTamabi 13 第8回:ARTSAT API 実践 2 衛星アプリを企画する
PDF
Interactive Music II SuperCollider実習 オリジナルの楽器を作ろう!
PDF
Geidai music131107
「クリエイティブ・ミュージック・コーディング」- オーディオ・ビジュアル作品のための、オープンソースなソフトウエア・フレームワークの現状と展望
プログラム初級講座 - メディア芸術をはじめよう
Interactive Music II ProcessingとSuperColliderの連携 -2
coma Creators session vol.2
Interactive Music II ProcessingとSuperColliderの連携1
Interactive Music II Processingによるアニメーション
Interactive Music II Processing基本
Interactive Music II SuperCollider応用 2 - SuperColliderとPure Dataの連携
Media Art II openFrameworks アプリ間の通信とタンジブルなインターフェイス
Interactive Music II SuperCollider応用 - SuperColliderと OSC (Open Sound Control)
メディア芸術基礎 II 第11回:HTML5実践 表現のための様々なJavaScriptライブラリ
芸術情報演習デザイン(Web) 第8回: CSSフレームワークを使う
Interactive Music II SuperCollider応用 JITLib - ライブコーディング 2
iTamabi 13 第9回:ARTSAT API 実践 3 ジオコーディングで衛星の位置を取得
Tamabi media131118
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Interactive Music II SuperCollider応用 JITLib - ライブコーディング 1
iTamabi 13 第8回:ARTSAT API 実践 2 衛星アプリを企画する
Interactive Music II SuperCollider実習 オリジナルの楽器を作ろう!
Geidai music131107

メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション