Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
changes to ofxRay compatability, triangulate an individual ProCam point
  • Loading branch information
elliotwoods committed Sep 9, 2013
1 parent 2d5256b commit 74a88d1
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 10 deletions.
43 changes: 34 additions & 9 deletions src/ofxTriangulate.cpp
Expand Up @@ -10,7 +10,8 @@
using namespace ofxRay;
using namespace ofxGraycode;

void ofxTriangulate::Triangulate(DataSet data, Camera camera, Projector projector, ofMesh & mesh, float maxLength) {
//--------
void ofxTriangulate::Triangulate(DataSet data, Camera camera, Projector projector, ofMesh & mesh, float maxLength, bool giveColor, bool giveTexCoord) {

mesh.clear();
float maxLength2=maxLength*maxLength;
Expand All @@ -19,27 +20,50 @@ void ofxTriangulate::Triangulate(DataSet data, Camera camera, Projector projecto
for (it = data.begin(); it != data.end(); ++it) {
DataSet::const_iterator::reference r = *it;
if ((*it).active) {

ofVec2f camXY = r.getCameraXYNorm();
ofVec2f projXY = r.getProjectorXYNorm();

camXY = camera.undistortCoordinate(camXY);

Ray cray = camera.castCoordinate(camXY);
Ray pray = projector.castCoordinate(projXY);
Ray intersect = cray.intersect(pray);

if (intersect.getLengthSquared() > maxLength2){
const auto lengthSquared = intersect.getLengthSquared();
if (lengthSquared > maxLength2){
continue;
}
//ofVec3f xyz = intersect.getMidpoint();
ofVec3f xyz = intersect.s;
ofVec3f xyz = intersect.getMidpoint();

mesh.addVertex(xyz);
mesh.addTexCoord(camXY);
mesh.addColor(ofFloatColor(projXY.x, projXY.y, 0.0f));

if (giveColor) {
mesh.addColor(ofFloatColor(projXY.x, projXY.y, 0.0f));
}

if (giveTexCoord) {
mesh.addTexCoord(camXY);
}
}
}
}
//--------
bool ofxTriangulate::Triangulate(int cameraPixelIndex, int projectorPixelIndex, const ofxRay::Camera& camera, const ofxRay::Projector& projector, ofVec3f& worldXYZResult, float maxLength) {
const ofVec2f cameraCoordinate = camera.getCoordinateFromIndex(cameraPixelIndex);
const ofVec2f projectorCoordinate = projector.getCoordinateFromIndex(projectorPixelIndex);
Ray cameraRay = camera.castCoordinate(cameraCoordinate);
Ray projectorRay = projector.castCoordinate(projectorCoordinate);
Ray intersect = cameraRay.intersect(projectorRay);

if (intersect.getLength() <= maxLength) {
worldXYZResult = intersect.getMidpoint();
return true;
} else {
return false;
}
}

//--------
void ofxTriangulate::Triangulate(DataSet data1, DataSet data2, Camera & camera1, Camera & camera2, ofMesh & mesh, float maxLength){
mesh.clear();
float maxLength2=maxLength*maxLength;
Expand All @@ -55,10 +79,11 @@ void ofxTriangulate::Triangulate(DataSet data1, DataSet data2, Camera & camera1,
}
}

//--------
ofVec3f ofxTriangulate::Triangulate(int cam1PixelIndex, int cam2PixelIndex, Camera & camera1, Camera & camera2) {

ofVec2f cam1XYNorm = camera1.getNormFromIndex(cam1PixelIndex);
ofVec2f cam2XYNorm = camera2.getNormFromIndex(cam2PixelIndex);
ofVec2f cam1XYNorm = camera1.getCoordinateFromIndex(cam1PixelIndex);
ofVec2f cam2XYNorm = camera2.getCoordinateFromIndex(cam2PixelIndex);
ofxRay::Ray cray1 = camera1.castCoordinate(cam1XYNorm);
ofxRay::Ray cray2 = camera2.castCoordinate(cam2XYNorm);
ofxRay::Ray intersect = cray1.intersect(cray2);
Expand Down
11 changes: 10 additions & 1 deletion src/ofxTriangulate.h
Expand Up @@ -16,7 +16,16 @@

class ofxTriangulate {
public:
static void Triangulate(ofxGraycode::DataSet, ofxRay::Camera, ofxRay::Projector, ofMesh & mesh, float maxLength);

///1 x Camera, 1 x Projector. Triangulate an ofxGraycode::DataSet
static void Triangulate(ofxGraycode::DataSet, ofxRay::Camera, ofxRay::Projector, ofMesh & mesh, float maxLength = std::numeric_limits<float>::max(), bool giveColor=true, bool giveTexCoord=true);

///1 x Camera, 1 x Projector. Triangulate an individual point
static bool Triangulate(int cameraPixelIndex, int projectorPixelIndex, const ofxRay::Camera&, const ofxRay::Projector&, ofVec3f& worldXYZResult, float maxLength = std::numeric_limits<float>::max());

///2 x Camera. Triangulate a single point
static ofVec3f Triangulate(int cam1PixelIndex, int cam2PixelIndex, ofxRay::Camera & camera1, ofxRay::Camera & camera2);

///2 x Camera. Triangulate a pair of ofxGraycode::DataSet's
static void Triangulate(ofxGraycode::DataSet data1, ofxGraycode::DataSet data2, ofxRay::Camera & camera1, ofxRay::Camera & camera2, ofMesh & mesh, float maxLength);
};

0 comments on commit 74a88d1

Please sign in to comment.