Bonjour à tous,
Je me présente je suis technicien dans une école d'art, je ne connais pas vraiment la programmation ( un peu de max msp et pure data ) mais je me suis mis en tête de faire un programme avec une kinect, une sorte de scanner 3D uniquement pour le visuel et me voila sur ce forum pour avoir un coup de main de pro car là je nage complètement.
Voici mon problème, j'arrive à avoir un image en maillage de mon sujet mais ma camera virtuel (OfEasyCam) refuse de tourner autour de mon sujet, elle tourne sur elle même comme si le sujet n'existé pas ! Quand je regarde cet exemple : https://www.youtube.com/watch?v=xndF-nlPBTE on voit bien que la camera virtuel tourne autour de son sujet... Et dans la bibliothèque d 'openFrameworks on trouve un exemple d'utilisation de la kinect dans les addons et là la camera fonction bien et tourne autour de son sujet.
Encore une fois je n'y connais pas grand chose, je fais un peu du lego en récupérant des codes à droit et à gauche pour construire mon programme.
je poste mon code cpp
#include "ofApp.h"
#include "ofMesh.h"
//--------------------------------------------------------------
void ofApp::setup(){
ofBackground(255);
kinect.init();
kinect.open();
// 0-300の部分だけ深度取る ここ割と細かく設定できると精度上がる気がした
//kinect.setDepthClipping(0,3000);
// これでColorの通常カメラと深度カメラのズレ修正できた
kinect.setRegistration(true);
// Kinect 初期の首角度
kinect.setCameraTiltAngle(-10);
Cam.setDistance(160);
//Cam.setTarget(model.getPosition());
//Cam.lookAt(model.getPosition(), ofVec3f(0,-1,0));
}
//--------------------------------------------------------------
void ofApp::update(){
//// update ////
kinect.update();
//clear
mesh.clear();
mesh2.clear();
points.clear();
colors.clear();
indexs.clear();
//Nombre de polygones du modele, 1 etant le superieur
int step = 1;//int(5 + int(scaledVol*15));
int total = 0;
for (int j = 0; j < kinect.height; j+=step)
{
vector <ofVec3f> temppoints;
vector <ofColor> tempcolors;
points.push_back(temppoints);
colors.push_back(tempcolors);
for (int i = 0; i < kinect.width; i+=step)
{
//distance de profondeur de champs
float distance = kinect.getDistanceAt(i, j);
if(distance>1 && distance<1000)
{
ofVec3f tempPoint;
ofColor tempColor;
tempPoint = ofVec3f((i-kinect.width/2.)*zoom, (-j+kinect.height/2.)*zoom, distance*-2.0 );
tempColor = ofColor(kinect.getColorAt(i,j));
points[j/step].push_back(tempPoint);
colors[j/step].push_back(tempColor);
total++;
}else{
ofVec3f tempPoint2;
ofColor tempColor2;
tempPoint2 = ofVec3f(i,j,0); //範囲外には深度0
tempColor2 = ofColor(0);
points[j/step].push_back(tempPoint2);
colors[j/step].push_back(tempColor2);
}
}
}
// Pour créer des artefacts, 0 etant sans bugs
int ind = 0;
for (int m = 0; m < kinect.height; m+=step)
{
vector <int> tempindexs;
indexs.push_back(tempindexs);
for (int n = 0; n < kinect.width; n+=step)
{
if(points[m/step][n/step].z != 0){
// cout << points[m][n] << endl;
mesh.addColor(colors[m/step][n/step]);
mesh.addVertex(points[m/step][n/step]);
mesh2.addColor(ofColor(0,0,0));
mesh2.addVertex(points[m/step][n/step]);
indexs[m/step].push_back(ind);
ind++;
}else{
indexs[m/step].push_back(-1);
}
}
}
// meshにTriangle追加
int W = int(kinect.width/step);
for (int b = 0; b < kinect.height-step; b+=step){
for (int a = 0; a < kinect.width-1; a+=step)
{
if( (indexs[int(b/step)][int(a/step)]!=-1 && indexs[int(b/step)][int(a/step+1)]!=-1) && (indexs[int(b/step+1)][int(a/step+1)]!=-1 && indexs[int(b/step+1)][int(a/step)]!=-1) ){
//mesh.addTriangle(indexs[int(b/step)][int(a/step)],indexs[int(b/step)][int(a/step+1)],indexs[int(b/step+1)][int(a/step+1)]);
mesh.addTriangle(indexs[int(b/step)][int(a/step)],indexs[int(b/step+1)][int(a/step+1)],indexs[int(b/step+1)][int(a/step)]);
mesh2.addTriangle(indexs[int(b/step)][int(a/step)],indexs[int(b/step)][int(a/step+1)],indexs[int(b/step+1)][int(a/step+1)]);
mesh2.addTriangle(indexs[int(b/step)][int(a/step)],indexs[int(b/step+1)][int(a/step+1)],indexs[int(b/step+1)][int(a/step)]);
}
}
}
}
//--------------------------------------------------------------
void ofApp::draw(){
//// draw ////
Cam.begin();
// le maillage du modele, on peut utiliser ça: OF_PRIMITIVE_TRIANGLES, OF_PRIMITIVE_TRIANGLE_STRIP, OF_PRIMITIVE_TRIANGLE_FAN, OF_PRIMITIVE_LINES, OF_PRIMITIVE_LINE_STRIP, OF_PRIMITIVE_LINE_LOOP, OF_PRIMITIVE_POINTS
//mesh.setMode(OF_PRIMITIVE_TRIANGLES);
//glLineWidth(int(LINE_WEIGHT));
//mesh.setMode(OF_PRIMITIVE_POINTS);
//glLineWidth(int(LINE_WEIGHT));
//mesh.draw();//Wireframe();
mesh.setMode(OF_PRIMITIVE_LINE_STRIP);
glLineWidth(int(LINE_WEIGHT));
mesh.draw();//Wireframe();
//mesh2.setMode(OF_PRIMITIVE_POINTS);
//mesh2.drawWireframe();
Cam.end();
}
//--------------------------------------------------------------
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){
}
Oui je sais c'est programmé avec les pieds
Merci pour un petit coup de main car là je bloque depuis pas mal de temps j'ai vu qu'il y avait un objet mais je ne comprends pas comment mon model s'appelle....
Bonne journée à vous
Hors ligne
Pages: 1