summaryrefslogtreecommitdiff
path: root/gaunt01/src/testApp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gaunt01/src/testApp.cpp')
-rw-r--r--gaunt01/src/testApp.cpp189
1 files changed, 144 insertions, 45 deletions
diff --git a/gaunt01/src/testApp.cpp b/gaunt01/src/testApp.cpp
index 87a51c4..aebbe0b 100644
--- a/gaunt01/src/testApp.cpp
+++ b/gaunt01/src/testApp.cpp
@@ -4,11 +4,11 @@
//units ~ 10cm
//
void testApp::setup(){
-
+
bLearnBakground = true;
cam_angle=0;
threshold = 80;
-
+
loadSettings("settings.xml");
vidPlayer.loadMovie("camoutput.mov"); //footage/ camera needs to be the same res as opencv planes and output
@@ -18,19 +18,24 @@ void testApp::setup(){
hasCamera=true;
useCamera=true;
}
- else
+ else
{
hasCamera=false;
useCamera=false;
vidPlayer.play();
}
-
colorImg.allocate(640,480);
colorImg.setUseTexture(true);
grayImage.allocate(640,480);
grayBg.allocate(640,480);
grayDiff.allocate(640,480);
+
+ blobsManager.normalizePercentage = 0.7;
+ blobsManager.giveLowestPossibleIDs = true;
+ blobsManager.maxUndetectedTime = 500;
+ blobsManager.minDetectedTime = 2000;
+ blobsManager.debugDrawCandidates = true;
ofVec3f centre=ofVec3f(ofGetWidth()/2,0,0);
ofVec3f normal=ofVec3f(0,0,-1);
@@ -45,59 +50,104 @@ void testApp::setup(){
cam=ofCamera();
cam.setPosition(ofGetWidth()/2,ofGetHeight()/2,-ofGetWidth());
cam.lookAt(ofVec3f(ofGetWidth()/2,ofGetHeight()/2,0),ofVec3f(0, -1, 0));
- cam.setFov(41.0); //39.85); //53.13);
+ cam.setFov(41.1); //39.85); //53.13);
+ cam.cacheMatrices(); //stop error messages
+
+ testpts=new ofVec3f[4];
+ trapDoor=trapdoor(screen2plane(ofVec2f(ofGetWidth(),0)),screen2plane(ofVec2f(ofGetWidth(),ofGetHeight())),ofVec2f(30,30));
updatePlane();
-
+
mode=PLAY;
+
}
ofVec2f testApp::screen2plane(ofVec2f screenpos){
ofVec3f p;
- ray=projector.castPixel(screenpos.x,screenpos.y);
+ ray=projector.castPixel(screenpos.x,screenpos.y);
bool hit = plane.intersect(ray,p);
return ofVec2f(p.x,pow(pow(p.y,2)+pow(p.z,2),0.5f));
}
ofVec3f testApp::plane2world(ofVec2f planepos){
return ofVec3f(planepos.x,planepos.y,0);
}
+bool testApp::rectsCross(ofRectangle rect1,ofRectangle rect2) {
+ bool overlap=true; //must overlap in x and y
+ if (rect1.x<rect2.x) {
+ if (rect1.x+rect1.width<rect2.x) overlap = false;
+ }
+ else if (rect2.x<rect1.x) {
+ if (rect2.x+rect2.width<rect1.x) overlap = false;
+ }
+ if (overlap) { //still possible
+ if (rect1.y<rect2.y) {
+ if (rect1.y+rect1.height<rect2.y) overlap = false;
+ }
+ else if (rect2.y<rect1.y) {
+ if (rect2.y+rect2.height<rect1.y) overlap = false;
+ }
+ }
+ return overlap;
+}
+
void testApp::updatePlane(){
- plane.setNormal(ofVec3f(0,sin(cam_angle*0.01745329),-cos(cam_angle*0.01745329)));
- trapDoor=trapdoor(screen2plane(ofVec2f(ofGetWidth(),0)),screen2plane(ofVec2f(ofGetWidth(),ofGetHeight())),ofVec2f(20,20));
+ plane.setNormal(ofVec3f(0,sin(cam_angle*DEG_TO_RAD),-cos(cam_angle*DEG_TO_RAD)));
//create ground mesh with hole for trapdoor
ground=ofMesh();
- ground.addVertex(plane2world(screen2plane(ofVec2f(0,0))));
+ ground.addVertex(ofVec3f(0,0,0));
ground.addTexCoord(ofVec2f(0,0));
- ground.addVertex(plane2world(screen2plane(ofVec2f(ofGetWidth(),0))));
+ ground.addVertex(ofVec3f(ofGetWidth(),0,0));
ground.addTexCoord(ofVec2f(1,0));
- ground.addVertex(plane2world(screen2plane(ofVec2f(ofGetWidth(),ofGetHeight()))));
+ ground.addVertex(ofVec3f(ofGetWidth(),ofGetHeight(),0));
ground.addTexCoord(ofVec2f(1,1));
- ground.addVertex(plane2world(screen2plane(ofVec2f(0,ofGetHeight()))));
+ ground.addVertex(ofVec3f(0,ofGetHeight(),0));
ground.addTexCoord(ofVec2f(0,1));
-
- ground.addTriangle(0,2,1);
- ground.addTriangle(0,3,2);
-
- /*
+
vector<ofVec2f> corners=trapDoor.getCorners();
+ ofVec2f screenCorners[4];
+
for (int i=0;i<corners.size();i++) {
- ground.addVertex(plane2world(corners[0]));
- ground.addTexCoord(trapDoor.bounds2UV(corners[0]));
+
+ ofNode axis;
+ ofNode c;
+ c.setParent(axis);
+
+ c.setPosition(corners[i].x,corners[i].y,0);
+
+ axis.rotate(cam_angle,1,0,0);
+
+ ofVec3f p=c.getGlobalPosition();
+
+ testpts[i]=p;
+ ofVec3f s=cam.worldToScreen(p);
+ //printf("corner %i: %f,%f,%f\n",i,s.x,s.y,s.z);
+ screenCorners[i]=ofVec2f(s.x,s.y);
+
+ ground.addVertex(s);
+ ground.addTexCoord(ofVec2f(s.x/ofGetWidth(),s.y/ofGetHeight()));
}
//join a quad for each side
- for (int i=0;i<corners.size();i++) {
- ground.addTriangle(i,i+4,i+1);
- ground.addTriangle(i+4,(i+5)%ground.getNumVertices(),i+1);
+ // the 2 rear sides should always point towards the rear
+ for (int i=0;i<3;i++) {
+ ground.addTriangle(i,i+4,i+5);
+ ground.addTriangle(i+5,i+1,i);
}
- */
+ ground.addTriangle(3,7,0);
+ ground.addTriangle(7,4,0);
+ float x=min(screenCorners[0].x,screenCorners[3].x);
+ float y=min(screenCorners[0].y,screenCorners[1].y);
+ float w=max(screenCorners[1].x,screenCorners[2].x)-x;
+ float h=max(screenCorners[2].y,screenCorners[3].y)-y;
+ trapDoor.setBoundingRect(x,y,w,h);
+
+
}
//--------------------------------------------------------------
void testApp::update(){
- ofBackground(100,100,100);
bool bNewFrame = false;
@@ -129,34 +179,71 @@ void testApp::update(){
// find contours which are between the size of 20 pixels and 1/3 the w*h pixels.
// also, find holes is set to true so we will get interior contours as well....
-
+
//hard coded size threshold of 100 pix
contourFinder.findContours(grayDiff, 200, (640*480)/3, 20, false); // don't find holes
+
+ blobsManager.update(contourFinder.blobs);
}
}
//--------------------------------------------------------------
void testApp::draw(){
+ ofBackground(0,0,0);
cam.begin();
-
+
+ if (trapDoor.checkUpdate(players)) updatePlane();
+
switch(mode) {
case PLAY:
glDisable(GL_DEPTH_TEST);
- //must be a better way than this
colorImg.draw(0,0,ofGetWidth(),ofGetHeight());
- ofFill();
ofSetHexColor(0x000000);
ofRect(0,0,ofGetWidth(),ofGetHeight());
+ //PITA
ofSetHexColor(0xffffff);
ofPushMatrix();
ofRotate(cam_angle,1,0,0);
- bindTexture(colorImg);
- ground.draw();
- unbindTexture(colorImg);
- trapDoor.checkUpdate(players);
trapDoor.draw();
ofPopMatrix();
+ ofSetHexColor(0xffffff);
+ /*
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_CONSTANT_ALPHA,GL_ONE);
+ glBlendColor(1.0f,1.0f,1.0f, 0.5f);
+ glDisable(GL_BLEND);
+ */
+
+ bindTexture(colorImg);
+ ground.draw();
+ unbindTexture(colorImg);
+
+ /*
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_CONSTANT_ALPHA,GL_ONE);
+ glBlendColor(1.0f,0.5f,0.1f, 0.5f);
+ ofRect(trapDoor.getBoundingRect());
+ glDisable(GL_BLEND);
+ */
+ for (int i = 0; i < contourFinder.nBlobs; i++){
+ ofxCvBlob blob=contourFinder.blobs[i];
+ if (rectsCross(blob.boundingRect,trapDoor.getBoundingRect())){
+ //create outline mesh
+ playeroutline=ofPolyline(blob.pts);
+ tesselator.tessellateToMesh(playeroutline,OF_POLY_WINDING_NONZERO,player,true);
+ for (int i=0;i<player.getNumVertices();i++) {
+ ofVec3f v=player.getVertex(i);
+ player.addTexCoord(ofVec2f(v.x,v.y));
+ }
+
+ colorImg.getTextureReference().bind();
+ player.draw();
+ colorImg.getTextureReference().unbind();
+ }
+ }
+
+
break;
case CALIBRATE:
ofFill();
@@ -167,7 +254,7 @@ void testApp::draw(){
//keep running background average- how do you use a custom background
ofSetHexColor(0xffffff);
colorImg.draw(0,0,ofGetWidth(),ofGetHeight());
-
+
ofPushMatrix();
ofRotate(cam_angle,1,0,0);
for (float i=0;i<=ofGetWidth();i+=ofGetWidth()/10) {
@@ -180,8 +267,17 @@ void testApp::draw(){
glVertex3f(ofGetWidth(),i,0);
glEnd();
}
+
+ ofVec2f pp=screen2plane(pos);
+ ofSphere(pp.x,pp.y,0,5);
+ ofPopMatrix();
+
+ ofPushMatrix();
+ ofRotate(cam_angle,1,0,0);
+ trapDoor.draw();
ofPopMatrix();
+
vector<ofVec3f> newPlayers;
float movethresh=10;
for (int i = 0; i < contourFinder.nBlobs; i++){
@@ -201,7 +297,7 @@ void testApp::draw(){
ofDrawBitmapString(numStr, r.x, r.y);
ofVec3f pp;
ray=projector.castPixel(blobBase.x,blobBase.y); //(ofGetHeight()-y));
- bool hit = plane.intersect(ray,pp);
+ bool hit = plane.intersect(ray,pp);
for (int i=0;i<players.size();i++) {
if (abs(players[i].x-pp.x)<10&&abs(players[i].z-pp.z)) {
//identified a player
@@ -209,23 +305,25 @@ void testApp::draw(){
//how to get UV coords on the plane
//maybe rotate the camera instead of the plane
+ //for the bird interaction, need to get player coords in the ground axis.
+ //for the door interaction, need to build player outline in the screen axis
+
+ //for the door, first determine if the boundings cross - create overlay
+ //if the base centre is in the hole- trigger falling behaviour
+
}
}
ofPushMatrix();
ofTranslate(pp);
ofRotate(cam_angle,1,0,0);
ofBox(0,-10,0,20);
- //for now, draw in this axis
+ //TODO get this into plane axis
ofPopMatrix();
+
+ //
}
-
- trapDoor.checkUpdate(players);
- ofPushMatrix();
- ofRotate(cam_angle,1,0,0);
- trapDoor.draw();
- ofPopMatrix();
-
-
+
+
// finally, a report:
ofSetHexColor(0xffffff);
@@ -297,7 +395,8 @@ void testApp::mouseReleased(int x, int y, int button){
pos=ofVec2f(x,y);
//if (hit) printf("ray:%i,%i hit plane:%f,%f,%f\n",x,y,pos.x,pos.y,pos.z);
//else printf("ray:%i,%i missed plane\n",x,y);
-
+ trapDoor.startPos(screen2plane(pos));
+ updatePlane();
}
//--------------------------------------------------------------