SlideShare uma empresa Scribd logo
1 de 53
Baixar para ler offline
Media Art II 2013
第7回 : openFrameworks
3Dグラフィクス、OpenGL
多摩美術大学情報デザイン学科メディア芸術コース
2013年10月28日
田所 淳
今日の内容
‣

openFrameworksの、3D機能、OpenGLの機能を中心に
取り上げます
今日の内容
‣

3DやOpenGLに関する機能を概観します
クラス名

機能

ofBox, ofSphere

3Dプリミティブオブジェクトの描画

ofEasyCam

簡単に利用可能なカメラ(視点)機能

ofLight

ライティング効果

ofMesh

3D物体の全ての頂点情報を持ったデータ

ofVBO

3Dシーンの物体の情報(位置・色)の保存

ofShader

プログラマブルシェーダ
3Dプリミティブ図形の描画
ofBox、ofSphere
3Dプリミティブ図形の描画 ofBox、ofSphere
‣

openFrameworks v080から、3Dの基本図形の描き方が
変化
!

‣

球体: ofSphere → ofSpherePrimtive

‣

立方体: ofBox → ofBoxPrimitive
!

‣

ofRectやofCircleのように、testApp::draw() 関数内に記
述して座標とサイズを指定するだけで簡単に利用可能
3Dプリミティブ図形の描画 ofBox、ofSphere
‣

testApp.h

#pragma once

!

#include "ofMain.h"

!

class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void
void
void
void
void
void
void
void
void

keyPressed(int key);
keyReleased(int key);
mouseMoved(int x, int y);
mouseDragged(int x, int y, int button);
mousePressed(int x, int y, int button);
mouseReleased(int x, int y, int button);
windowResized(int w, int h);
dragEvent(ofDragInfo dragInfo);
gotMessage(ofMessage msg);

ofBoxPrimitive box; // 立方体プリミティブ
ofSpherePrimitive sphere; // 球プリミティブ
};
3Dプリミティブ図形の描画 ofBox、ofSphere
‣

testApp.cpp

#include "testApp.h"

!

void testApp::setup(){
ofBackground(0);
}

!

void testApp::update(){
}

!

void testApp::draw(){
ofTranslate(ofGetWidth()/2, ofGetHeight()/2);
ofSetColor(255);
// 立方体
box.set(200); // サイズ設定
box.setPosition(-150, 0, 0); // 位置
box.drawWireframe(); // ワイヤーフレームを描画
// 球
sphere.set(100, 16); // 半径と面の細かさ
sphere.setPosition(150, 0, 0); // 位置
sphere.drawWireframe(); // ワイヤーフレームを描画
}
3Dプリミティブ図形の描画 ofBox、ofSphere
‣

完成!!
視点をインタラクティブに移動
ofEasyCam
視点をインタラクティブに移動 - ofEasyCam
‣

次に、この図形を様々な角度から眺められるようにする

‣

物体を動かすのではなく、視点(カメラ)を移動して、物体
を注視する角度を変更してみる

‣

視点を指定するofEasyCamというクラスがあり、とても
簡単に視点の移動が可能

‣

より詳細な視点や画角などの指定には、ofCameraという
クラスもある
視点をインタラクティブに移動 - ofEasyCam
‣

testApp.h

#pragma once

!

#include "ofMain.h"

!

class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void
void
void
void
void
void
void
void
void

keyPressed(int key);
keyReleased(int key);
mouseMoved(int x, int y);
mouseDragged(int x, int y, int button);
mousePressed(int x, int y, int button);
mouseReleased(int x, int y, int button);
windowResized(int w, int h);
dragEvent(ofDragInfo dragInfo);
gotMessage(ofMessage msg);

ofBoxPrimitive box; // 立方体プリミティブ
ofSpherePrimitive sphere; // 球プリミティブ
ofEasyCam cam; // カメラ
};
視点をインタラクティブに移動 - ofEasyCam
‣

testApp.cpp

… (前略) …

!

void testApp::draw(){
cam.begin(); // カメラ開始
ofSetColor(255);
// 立方体
box.set(200); // サイズ設定
box.setPosition(-150, 0, 0); // 位置
box.drawWireframe(); // ワイヤーフレームを描画
// 球
sphere.set(100, 16); // 半径と面の細かさ
sphere.setPosition(150, 0, 0); // 位置
sphere.drawWireframe(); // ワイヤーフレームを描画
cam.end(); // カメラ終了
}
視点をインタラクティブに移動 - ofEasyCam
‣

testApp.cpp

… (前略) …

!

void testApp::draw(){
cam.begin(); // カメラ開始
ofSetColor(255);
// 立方体

camera.begin( )と

box.set(200); // サイズ設定

camera.end( )で囲まれた範囲

box.setPosition(-150, 0, 0); // 位置

が、マウスのドラッグで視点変
更可能となる

box.drawWireframe(); // ワイヤーフレームを描画
// 球
sphere.set(100, 16); // 半径と面の細かさ
sphere.setPosition(150, 0, 0); // 位置
sphere.drawWireframe(); // ワイヤーフレームを描画
cam.end(); // カメラ終了
}
視点をインタラクティブに移動 - ofEasyCam
‣

マウスをドラッグすると物体を回転できる
ライティング
ofLight
ライティング - ofLight
‣

プリミティブを描画する命令
‣
‣

‣

プリミティブ.drawWireframe() → ワイヤーフレーム
プリミティブ.draw() → 塗り潰し

実際にやってみる
ライティング - ofLight
‣

testApp.cpp

void testApp::draw(){
cam.begin(); // カメラ開始
ofSetColor(255);
// 立方体
box.set(200); // サイズ設定
box.setPosition(-150, 0, 0); // 位置
box.draw(); // 塗りつぶしで描画

←ココ

// 球
sphere.set(100, 16); // 半径と面の細かさ
sphere.setPosition(150, 0, 0); // 位置
sphere.draw(); // 塗りつぶしで描画
cam.end(); // カメラ終了
}

←ココ
ライティング - ofLight
‣

陰影も何もない、のっぺりとした図形になってしまう
ライティング - ofLight
‣

なぜ、陰影のないのっぺりとした図形になってしまうのか?

‣

ライティングがされていないから

‣

適切な照明を物体に照射することで、リアルな陰影が表現
される

‣

ofLightクラスを使用する
ライティング - ofLight
‣

ofLightでは「Phongシェーディング」というアルゴリズ
ムで、物体にリアルな陰影や反射を付加している

‣

3Dグラフィックにおいて、モデリングされた面上の点に
影をつけるための照明と陰影モデル

‣

ユタ大学のBui Tuong Phongによって開発 (1973)
ライティング - ofLight
‣

Phongシェーディング

‣

3つの光の反射の強度と色を指定する
‣

鏡面反射 (Specular)

‣

拡散反射 (Diffuse)

‣

環境反射 (Ambient)
ライティング - ofLight
‣

testApp.h

#pragma once

!

#include "ofMain.h"

!

class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void
void
void
void
void
void
void
void
void

keyPressed(int key);
keyReleased(int key);
mouseMoved(int x, int y);
mouseDragged(int x, int y, int button);
mousePressed(int x, int y, int button);
mouseReleased(int x, int y, int button);
windowResized(int w, int h);
dragEvent(ofDragInfo dragInfo);
gotMessage(ofMessage msg);

ofBoxPrimitive box; // 立方体プリミティブ
ofSpherePrimitive sphere; // 球プリミティブ
ofEasyCam cam; // カメラ
ofLight light; // ライト
};
ライティング - ofLight
‣

testApp.cpp

… (前略) …

!

void testApp::setup(){
ofBackground(0);
// ライティングを有効に
light.enable();
// スポットライトを配置
light.setSpotlight();
// 照明の位置
light.setPosition(-100, 100, 100);
// 環境反射光の色
light.setAmbientColor(ofFloatColor(0.5, 0.2, 0.2, 1.0));
// 拡散反射光の色
light.setDiffuseColor(ofFloatColor(0.5, 0.5, 1.0));
// 鏡面反射光の色
light.setSpecularColor(ofFloatColor(1.0, 1.0, 1.0));
}

!

… (後略) …
ライティング - ofLight
‣

立体のの前後の重なりが、おかしい!?
ライティング - ofLight
‣

openFrameworksでは、そのままの設定では後から実行
した命令がどんどん上のレイヤーに描かれる

‣

3Dの立体の場合、有り得ない重なりになることも

‣

DEPTH TEST (深度テスト) を有効にする必要があり

‣

ofEnableDepthTest() で有効になる
ライティング - ofLight
‣

testApp.cpp を修正

… (前略) …

!

void testApp::setup(){
ofBackground(0);
ofEnableDepthTest(); // 深度テストを有効に
ofEnableSmoothing(); // 表示をスムースに

←ココ

// ライティングを有効に
light.enable();
// スポットライトを配置
light.setSpotlight();
// 照明の位置
light.setPosition(-100, 100, 100);
// 環境反射光の色
light.setAmbientColor(ofFloatColor(0.5, 0.2, 0.2, 1.0));
// 拡散反射光の色
light.setDiffuseColor(ofFloatColor(0.5, 0.5, 1.0));
// 鏡面反射光の色
light.setSpecularColor(ofFloatColor(1.0, 1.0, 1.0));
}

!

… (後略) …
ライティング - ofLight
‣

正しい重なりに
メッシュ (頂点情報の集合)
ofMesh
メッシュ (頂点情報の集合) - ofMesh
‣

立方体や球体などの単純な図形ではなく、より複雑な曲面
や多面体などの3Dの形状を描くにはどうすれば良いのか?

‣

ポリゴンメッシュ (Polygon Mesh) を使用する

‣

openFrameworksでは、ofMeshクラスで生成できる
メッシュ (頂点情報の集合) - ofMesh
‣

メッシュによって構成された複雑な形状の例
メッシュ (頂点情報の集合) - ofMesh
‣

メッシュ (ポリゴンメッシュ Polygon Mesh)

‣

3Dグラフィックのモデリングの多面体オブジェクトの形
状を定義する頂点、辺、面の集合のこと

‣

通常は三角形や四角形のポリゴン(面)によって構成される
メッシュ (頂点情報の集合) - ofMesh
‣

sin関数を利用して波を生成し、その3Dの形態をメッシュ
で表現してみる

‣

まず、x, y軸方向に均等に並ぶグリッドを作成

‣

グリッドの頂点をそれぞれ、x軸、y軸で異なる周波数のsin
関数で上下に振動させる

‣

頂点の座標を描画する
メッシュ (頂点情報の集合) - ofMesh
‣

testApp.h

#pragma once

!

#include "ofMain.h"

!

class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void
void
void
void
void
void
void
void
void

keyPressed(int key);
keyReleased(int key);
mouseMoved(int x, int y);
mouseDragged(int x, int y, int button);
mousePressed(int x, int y, int button);
mouseReleased(int x, int y, int button);
windowResized(int w, int h);
dragEvent(ofDragInfo dragInfo);
gotMessage(ofMessage msg);

ofEasyCam cam; // カメラ
ofMesh mesh; // 3Dメッシュ
int w, h; // メッシュの幅と高さ
};
メッシュ (頂点情報の集合) - ofMesh
‣

testApp.cpp

#include "testApp.h"

!

void testApp::setup(){
// 画面の設定
ofBackground(0);
ofEnableDepthTest();
cam.setDistance(100);
// メッシュの幅と高さ
w = 200;
h = 200;
// 頂点の色を初期化
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
mesh.addColor(ofFloatColor(0.5, 0.8, 1.0));
}
}
}
メッシュ (頂点情報の集合) - ofMesh
‣

testApp.cpp

void testApp::update(){
// まず全ての頂点情報を削除
mesh.clearVertices();
// 全ての頂点の位置を更新して頂点情報として追加
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
float x = sin(i * 0.1 + ofGetElapsedTimef())*10.0;
float y = sin(j*0.15 + ofGetElapsedTimef()) * 10.0;
float z = x + y;
mesh.addVertex(ofVec3f(i - w/2, j - h/2, z));
}
}
}
メッシュ (頂点情報の集合) - ofMesh
‣

testApp.cpp

void testApp::draw(){
// メッシュの描画
ofSetHexColor(0xffffff);
cam.begin(); // カメラ開始
// 頂点の位置をドットで表示
glPointSize(2.0);
glEnable(GL_POINT_SMOOTH);
mesh.drawVertices();
cam.end(); // カメラ終了
// ログの表示
string info;
info = "Vertex num = " + ofToString(w * h, 0) + "n";
info += "FPS = " + ofToString(ofGetFrameRate(), 2);
ofDrawBitmapString(info, 30, 30);
}
メッシュ (頂点情報の集合) - ofMesh
‣

完成!!
VBO (頂点バッファオブジェクト)
ofVBO
VBO (頂点バッファオブジェクト) - ofVBO
‣

ポリゴンメッシュなどの複雑な3D形状

‣

大量の頂点の情報を高速に演算する必要がある

‣

CPUに高負荷な演算
!

‣

VBO (頂点バッファオブジェクト)

‣

あらかじめ頂点データをOpenGL側に作成しておき、グラフィ
クスカード側で演算を行う手法

‣

CPUの負荷を減らし、高速な描画を実現する
!

‣

先程ofMeshで作成した3Dの波を、ofVBOによる計算に変更し
てみる
VBO (頂点バッファオブジェクト) - ofVBO
‣

VBOのイメージ
GPU

大量の頂点
座標情報

高速演算

大量の頂点
色情報

CPU
VBO (頂点バッファオブジェクト) - ofVBO
‣

testApp.h

#pragma once

!

#include "ofMain.h"

!

class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
… (中略) …
// クラス定数
static const int WIDTH = 200;
static const int HEIGHT = 200;
static const int NUM_PARTICLES = WIDTH * HEIGHT;
ofEasyCam cam; // カメラ
ofVbo myVbo; // VBO
ofVec3f myVerts[NUM_PARTICLES]; // 頂点の座標
ofFloatColor myColor[NUM_PARTICLES]; // 頂点の色情報
};
VBO (頂点バッファオブジェクト) - ofVBO
‣

testApp.cpp

#include "testApp.h"

!

const int testApp::WIDTH;
const int testApp::HEIGHT;
const int testApp::NUM_PARTICLES;

!

void testApp::setup(){
// 画面の設定
ofBackground(0);
ofEnableDepthTest();
ofEnableBlendMode(OF_BLENDMODE_ADD);
cam.setDistance(100);
// 頂点情報を初期化
for (int i = 0; i <
for (int j = 0;
myVerts[j *
myColor[j *
}
}

WIDTH; i++) {
j < HEIGHT; j++) {
WIDTH + i].set(i - WIDTH/2, j - HEIGHT/2, 0);
WIDTH + i].set(0.5, 0.8, 1.0, 1.0);

// 頂点バッファに位置と色の情報を設定
myVbo.setVertexData(myVerts, NUM_PARTICLES, GL_DYNAMIC_DRAW);
myVbo.setColorData(myColor, NUM_PARTICLES, GL_DYNAMIC_DRAW);
}
VBO (頂点バッファオブジェクト) - ofVBO
‣

testApp.cpp

void testApp::update(){
// 頂点の座標を更新
for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
float x = sin(i * 0.1 + ofGetElapsedTimef()) * 10.0;
float y = sin(j * 0.15 + ofGetElapsedTimef()) * 10.0;
float z = x + y;
myVerts[j * WIDTH + i] = ofVec3f(i - WIDTH/2, j - HEIGHT/2, z);
}
}
// 頂点バッファの頂点の座標情報を更新
myVbo.updateVertexData(myVerts, NUM_PARTICLES);
}

!

void testApp::draw(){
// VBOの頂点を描画
cam.begin();
glPointSize(2);
myVbo.draw(GL_POINTS, 0, NUM_PARTICLES);
cam.end();
// ログの表示
string info;
info = "Vertex num = " + ofToString(NUM_PARTICLES, 0) + "n";
info += "FPS = " + ofToString(ofGetFrameRate(), 2);
ofDrawBitmapString(info, 30, 30);
}
VBO (頂点バッファオブジェクト) - ofVBO
‣

完成!!
VBO 応用
カメラの明度でメッシュを生成
カメラの明度でメッシュを生成
‣

VBO + Mesh、応用

‣

カメラから映像を入力

‣

映像のそれぞれのピクセルの明さを頂点の高さに

‣

ビデオからの色を、頂点の色に
VBO (頂点バッファオブジェクト) - ofVBO
‣

testApp.h

#pragma once

!

#include "ofMain.h"

!

class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
… (中略) …
// クラス定数
static const int WIDTH = 640;
static const int HEIGHT = 480;
static const int NUM_PARTICLES = WIDTH * HEIGHT;
ofEasyCam cam; // カメラ
ofLight light; // ライト
ofVbo myVbo; // VBO
ofVec3f myVerts[NUM_PARTICLES]; // 頂点の座標
ofFloatColor myColor[NUM_PARTICLES]; // 頂点の色情報
ofVideoGrabber myVideo;
};

// ビデオキャプチャ
VBO (頂点バッファオブジェクト) - ofVBO
‣

testApp.cpp

#include "testApp.h"

!

const int testApp::WIDTH;
const int testApp::HEIGHT;
const int testApp::NUM_PARTICLES;

!

void testApp::setup(){
// 画面の設定
ofBackground(0);
ofEnableDepthTest();
ofEnableBlendMode(OF_BLENDMODE_ADD);
cam.setDistance(400);
myVideo.initGrabber(640, 480); // カメラ映像をキャプチャ

!
// 頂点情報を初期化
for (int i = 0; i <
for (int j = 0;
myVerts[j *
myColor[j *
}
}

WIDTH; i++) {
j < HEIGHT; j++) {
WIDTH + i].set(i - WIDTH/2, j - HEIGHT/2, 0);
WIDTH + i].set(1.0, 1.0, 1.0, 1.0);

// 頂点バッファに位置と色の情報を設定
myVbo.setVertexData(myVerts, NUM_PARTICLES, GL_DYNAMIC_DRAW);
myVbo.setColorData(myColor, NUM_PARTICLES, GL_DYNAMIC_DRAW);
}
VBO (頂点バッファオブジェクト) - ofVBO
‣

testApp.cpp

void testApp::update(){
// カメラからの映像を更新
myVideo.update();
// もしカメラのフレームが更新されていたら
if (myVideo.isFrameNew()) {
// カメラの映像のピクセル情報を抽出
unsigned char * pixels = myVideo.getPixels();
// ピクセルごとに処理
for (int i = 0; i < WIDTH; i++) {
for (int j = 0; j < HEIGHT; j++) {
// ピクセルノRGB値を取得
float r = (float)pixels[j * myVideo.width * 3 + i * 3] / 256.0;
float g = (float)pixels[j * myVideo.width * 3 + i * 3 + 1] / 256.0;
float b = (float)pixels[j * myVideo.width * 3 + i * 3 + 2] / 256.0;
// RGBから明度を算出
float brightness = (r + g + b) / 3.0f;
// 明度から頂点の位置を設定
myVerts[j * WIDTH + i] = ofVec3f(i - WIDTH/2, j - HEIGHT/2, brightness * 256.0);
// 頂点の色はカメラのピクセルの値をそのまま使用
}

myColor[j * WIDTH + i] = ofFloatColor(r, g, b, 0.8);

}
// VBOの座標と色の情報を更新

}

}

myVbo.updateVertexData(myVerts, NUM_PARTICLES);
myVbo.updateColorData(myColor, NUM_PARTICLES);
VBO (頂点バッファオブジェクト) - ofVBO
‣

testApp.cpp

void testApp::draw(){
// VBOを描画
cam.begin();
ofScale(1, -1, 1);
glPointSize(3);
myVbo.draw(GL_POINTS, 0, NUM_PARTICLES);
cam.end();
// ログの表示
string info;
info = "Vertex num = " + ofToString(NUM_PARTICLES, 0) + "n";
info += "FPS = " + ofToString(ofGetFrameRate(), 2);
ofDrawBitmapString(info, 30, 30);
}
カメラの明度でメッシュを生成
‣

完成!!
VBO (頂点バッファオブジェクト) - ofVBO
‣

よりVBOのパワーを実感できるサンプル

‣

大量のパーティクルをnoise関数で飛散させる

‣

それぞれのパーティクルにはテクスチャ画像を貼る

‣

高速にアニメーションしてみる
VBO (頂点バッファオブジェクト) - ofVBO
‣

大量のパーティクルを高速にアニメーション

Mais conteúdo relacionado

Mais procurados

openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
Atsushi Tadokoro
 
複数台のKinectV2の使い方
複数台のKinectV2の使い方複数台のKinectV2の使い方
複数台のKinectV2の使い方
Norishige Fukushima
 
Media Art II openFrameworks 複数のシーンの管理・切替え
Media Art II openFrameworks 複数のシーンの管理・切替えMedia Art II openFrameworks 複数のシーンの管理・切替え
Media Art II openFrameworks 複数のシーンの管理・切替え
Atsushi Tadokoro
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
 
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートIIopenFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
Atsushi Tadokoro
 

Mais procurados (20)

AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
AI x WebAR: MediaPipeのハンドトラッキングを使ってみようAI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
 
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
 
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
 
OpenGL ES and Mobile GPU
OpenGL ES and Mobile GPUOpenGL ES and Mobile GPU
OpenGL ES and Mobile GPU
 
複数台のKinectV2の使い方
複数台のKinectV2の使い方複数台のKinectV2の使い方
複数台のKinectV2の使い方
 
Media Art II openFrameworks 複数のシーンの管理・切替え
Media Art II openFrameworks 複数のシーンの管理・切替えMedia Art II openFrameworks 複数のシーンの管理・切替え
Media Art II openFrameworks 複数のシーンの管理・切替え
 
Optimizer入門&最新動向
Optimizer入門&最新動向Optimizer入門&最新動向
Optimizer入門&最新動向
 
さるでも分かりたい9dofで作るクォータニオン姿勢
さるでも分かりたい9dofで作るクォータニオン姿勢さるでも分かりたい9dofで作るクォータニオン姿勢
さるでも分かりたい9dofで作るクォータニオン姿勢
 
OpenCV/ARCore/Unityで作る塗り絵AR
OpenCV/ARCore/Unityで作る塗り絵AROpenCV/ARCore/Unityで作る塗り絵AR
OpenCV/ARCore/Unityで作る塗り絵AR
 
Map
MapMap
Map
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
実践QBVH
実践QBVH実践QBVH
実践QBVH
 
パタヘネゼミ 第6章
パタヘネゼミ 第6章パタヘネゼミ 第6章
パタヘネゼミ 第6章
 
【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター
 
OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門OpenCVを用いた画像処理入門
OpenCVを用いた画像処理入門
 
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートIIopenFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
openFrameworks – パーティクルを動かす、静的配列と動的配列 - 多摩美メディアアートII
 
Azure Kinect DK C/C++ 開発概要(仮)
Azure Kinect DK C/C++ 開発概要(仮)Azure Kinect DK C/C++ 開発概要(仮)
Azure Kinect DK C/C++ 開発概要(仮)
 
[DL輪読会]Deep Neural Networks as Gaussian Processes
[DL輪読会]Deep Neural Networks as Gaussian Processes[DL輪読会]Deep Neural Networks as Gaussian Processes
[DL輪読会]Deep Neural Networks as Gaussian Processes
 
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
 
はじめようARCore:自己位置推定・平面検出・FaceTracking
はじめようARCore:自己位置推定・平面検出・FaceTrackingはじめようARCore:自己位置推定・平面検出・FaceTracking
はじめようARCore:自己位置推定・平面検出・FaceTracking
 

Destaque

メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oFメディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
Atsushi Tadokoro
 
Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
Media Art II 2013  第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCvMedia Art II 2013  第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
Media Art II 2013 第6回:openFrameworks Addonを使う 2 - ofxOpenCV と ofxCv
Atsushi Tadokoro
 
ノンデザイナーのための配色理論
ノンデザイナーのための配色理論ノンデザイナーのための配色理論
ノンデザイナーのための配色理論
tsukasa obara
 

Destaque (16)

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

Semelhante a Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL

iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!
cocopon
 
怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミング
nagoya313
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
AdvancedTechNight
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
Hiroshi Oyamada
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessing
ushiostarfish _
 
プログラミング技法特論第8回
プログラミング技法特論第8回プログラミング技法特論第8回
プログラミング技法特論第8回
Noritada Shimizu
 

Semelhante a Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL (20)

Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOn
 
Flashup 12 Basic Training of Away3D
Flashup 12 Basic Training of Away3DFlashup 12 Basic Training of Away3D
Flashup 12 Basic Training of Away3D
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門
 
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
 
Arctic.js
Arctic.jsArctic.js
Arctic.js
 
Ogre3d 基礎
Ogre3d 基礎Ogre3d 基礎
Ogre3d 基礎
 
Flashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3DFlashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3D
 
iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!
 
怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミング
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
 
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessing
 
CG2013 12
CG2013 12CG2013 12
CG2013 12
 
プログラミング技法特論第8回
プログラミング技法特論第8回プログラミング技法特論第8回
プログラミング技法特論第8回
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
はじめようRGB-Dセンシングと画像処理
はじめようRGB-Dセンシングと画像処理はじめようRGB-Dセンシングと画像処理
はじめようRGB-Dセンシングと画像処理
 
Sencha study
Sencha studySencha study
Sencha study
 
Gocon2013
Gocon2013Gocon2013
Gocon2013
 
Android gameprogramming
Android gameprogrammingAndroid gameprogramming
Android gameprogramming
 

Mais de Atsushi Tadokoro

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

Mais de Atsushi Tadokoro (20)

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

Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL