demo
明度によって頂点のZ軸方向の位置を決めています。今回は黒に近いニット帽被っているので、鼻から上の頭がへっこんでいます。これは帽子の明度が小さいからだと思われます。途中で向きが変わるのはドラッグでカメラの位置が変わるからです。
・参考
code
コードを一部抜粋してみます。
//ビデオ
ofVideoGrabber myVideo;
void ofApp::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; //明度 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); } }
明度から頂点の位置を算出してるところがポイントです。
void ofApp::draw(){ //カメラ開始 cam.begin(); ofScale(1,-1,3); //頂点をドットで表示 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); }
今回は明度による奥行きを強調するためにZ軸方向を3倍に引き伸ばしました。