diff --git a/src/ofxTriangulate.cpp b/src/ofxTriangulate.cpp index 4ad4f7b..6110f9a 100644 --- a/src/ofxTriangulate.cpp +++ b/src/ofxTriangulate.cpp @@ -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; @@ -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; @@ -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); diff --git a/src/ofxTriangulate.h b/src/ofxTriangulate.h index 241656c..fdea438 100644 --- a/src/ofxTriangulate.h +++ b/src/ofxTriangulate.h @@ -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::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::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); };