openFrameworksでカメラの映像を3Dにする
OpenFrameworksでカメラ画像を3D空間上に表示するプログラムを書いた.各点の輝度をz値にしている似非立体画像.本当はlightオブジェクトを置いて陰影をつけたかったが,まだofLightについて理解してないため断念.
下の画像は,ワイヤフレームだけを表示したもの.こっちのほうが3Dっぽい.
コードは以下.
ofApp.h
#pragma once
#include "ofMain.h"
class ofApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void mouseEntered(int x, int y);
void mouseExited(int x, int y);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
ofVideoGrabber videoGrabber;
ofMesh mesh;
float xInterval, yInterval;
};
ofApp.cpp
#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup(){
ofBackground(0);
videoGrabber.setup(80, 60);
xInterval = float(ofGetWidth()) / videoGrabber.getWidth();
yInterval = float(ofGetHeight()) / videoGrabber.getHeight();
ofEnableDepthTest();
ofEnableSmoothing();
mesh.setMode(OF_PRIMITIVE_TRIANGLES);
mesh.enableColors();
mesh.enableIndices();
}
//--------------------------------------------------------------
void ofApp::update(){
videoGrabber.update();
if(videoGrabber.isFrameNew()){
unsigned char * pixels = videoGrabber.getPixels();
mesh.clearVertices();
mesh.clearColors();
mesh.clearIndices();
for(int h = 0; h < videoGrabber.getHeight(); h++){
for(int w = 0; w < videoGrabber.getWidth(); w++){
float r = (float)pixels[int(h * videoGrabber.getWidth() + w) * 3] / 256.0;
float g = (float)pixels[int(h * videoGrabber.getWidth() + w) * 3 + 1] / 256.0;
float b = (float)pixels[int(h * videoGrabber.getWidth() + w) * 3 + 2] / 256.0;
ofFloatColor color = ofFloatColor(r, g, b);
float z = ofMap(color.getBrightness(), 0, 1, 300, -300);
mesh.addColor(color);
mesh.addVertex(ofVec3f(w * xInterval, h * yInterval, z));
}
}
for(int h = 0; h < videoGrabber.getHeight() - 1; h++){
for(int w = 0; w < videoGrabber.getWidth() - 1; w++){
mesh.addIndex(h * videoGrabber.getWidth() + w);
mesh.addIndex(h * videoGrabber.getWidth() + w + 1);
mesh.addIndex((h + 1) * videoGrabber.getWidth() + w + 1);
mesh.addIndex(h * videoGrabber.getWidth() + w);
mesh.addIndex((h + 1) * videoGrabber.getWidth() + w);
mesh.addIndex((h + 1) * videoGrabber.getWidth() + w + 1);
}
}
}
}
//--------------------------------------------------------------
void ofApp::draw(){
mesh.draw();
// mesh.drawWireframe();
}
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
}
//--------------------------------------------------------------
void ofApp::keyReleased(int key){
}
//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){
}
//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mouseEntered(int x, int y){
}
//--------------------------------------------------------------
void ofApp::mouseExited(int x, int y){
}
//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){
}
//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg){
}
//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){
}
openFrameworks/camera3d at master · aa-debdeb/openFrameworks