From 0c2a97dcc0fb370938dc0d2d3a27053c2c9cb31e Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Tue, 3 Apr 2012 23:06:21 +0100 Subject: blobs tesselated into textured polys --- gaunt01/addons.make | 1 + gaunt01/src/testApp.cpp | 189 ++++++++++++++++++++++++++++++++++++----------- gaunt01/src/testApp.h | 11 +++ gaunt01/src/trapdoor.cpp | 71 ++++++++++++------ gaunt01/src/trapdoor.h | 28 ++++--- 5 files changed, 224 insertions(+), 76 deletions(-) (limited to 'gaunt01') diff --git a/gaunt01/addons.make b/gaunt01/addons.make index 22fba83..d5faedd 100644 --- a/gaunt01/addons.make +++ b/gaunt01/addons.make @@ -1,3 +1,4 @@ ofxOpenCv +ofxBlobsManager ofxRay ofxXmlSettings 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 corners=trapDoor.getCorners(); + ofVec2f screenCorners[4]; + for (int i=0;i 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; trapdoor trapDoor; ofMesh ground; + + ofVec3f* testpts; + + ofTessellator tesselator; + ofMesh player; + ofPolyline playeroutline; }; diff --git a/gaunt01/src/trapdoor.cpp b/gaunt01/src/trapdoor.cpp index ce06b4a..d1f436e 100644 --- a/gaunt01/src/trapdoor.cpp +++ b/gaunt01/src/trapdoor.cpp @@ -5,46 +5,64 @@ trapdoor::trapdoor(ofVec2f _boundTR,ofVec2f _boundBR,ofVec2f _doorSize) surround=morphmesh("trapdoor-surround.xml"); lid=morphmesh("trapdoor-lid.xml"); if (!surround.isLoaded()||!lid.isLoaded()) printf("problem loading trap door mesh.\n"); - + texture.loadImage("TextureTrapdoor.jpg"); - + + sounds=new ofSoundPlayer[4]; + sounds[0].loadSound("creeky door short1.wav"); + sounds[1].loadSound("creeky door short2.wav"); + sounds[2].loadSound("creeky door short3.wav"); + sounds[3].loadSound("voice falling down hole.wav"); + boundTR=_boundTR; boundBR=_boundBR; - - printf("trapdoor bounds: %f,%f - %f,%f\n",boundTR.x,boundTR.y,boundBR.x,boundBR.y); - + size=_doorSize; start(); } -trapdoor::~trapdoor() {} - +trapdoor::~trapdoor() { + } + void trapdoor::start(){ //place trapdoor within bounds float u=ofRandom(-0.9,0.9); //(-1 to 1) float v=ofRandom(0.05,0.95); float mx=ofGetWidth()/2; - + float x=mx+((boundTR.x-mx)*u*(1-v))+((boundBR.x-mx)*u*v); float y=boundTR.y+((boundBR.y-boundTR.y)*v); - printf("new trapdoor: %f,%f\n",x,y); - position=ofVec2f(x,y); + startPos(ofVec2f(x,y)); +} + +void trapdoor::startPos(ofVec2f pos){ + position=pos; startTime=ofGetElapsedTimef(); doorAngle=0; doorSpeed=0; + opening=false; + //for (int i=0;i<4;i++) sounds[i].stop(); + } vector trapdoor::getCorners(){ vector corners; - corners.push_back(ofVec2f(-size.x/2,-size.y/2)); - corners.push_back(ofVec2f(size.x/2,-size.y/2)); - corners.push_back(ofVec2f(size.x/2,size.y/2)); - corners.push_back(ofVec2f(-size.x/2,size.y/2)); + corners.push_back(ofVec2f(position.x-(size.x/2),position.y-(size.y/2))); + corners.push_back(ofVec2f(position.x+(size.x/2),position.y-(size.y/2))); + corners.push_back(ofVec2f(position.x+(size.x/2),position.y+(size.y/2))); + corners.push_back(ofVec2f(position.x-(size.x/2),position.y+(size.y/2))); return corners; } +void trapdoor::setBoundingRect(float x,float y, float width,float height){ + boundingRect=ofRectangle(x,y,width,height); +} +ofRectangle trapdoor::getBoundingRect(){ + return boundingRect; +} + ofVec2f trapdoor::bounds2UV(ofVec2f point){ //returns the 0-1 UV coords of a point on the ground plane relative to its bounds. float v=(point.y-boundTR.y)/(boundBR.y-boundTR.y); @@ -52,26 +70,37 @@ ofVec2f trapdoor::bounds2UV(ofVec2f point){ float u=((point.x-mx)/(((boundTR.x-mx)*(1-v))+((boundBR.x-mx)*v)))+0.5; return ofVec2f(u,v); } - -void trapdoor::checkUpdate(const vector& players) { + +bool trapdoor::checkUpdate(const vector& players) { float segTime=(ofGetElapsedTimef()-startTime); - if (segTime>5) start(); if (segTime>3) { doorSpeed=(doorSpeed+((cos(doorAngle*0.0174532925)/ofGetFrameRate())*50))*0.95; doorAngle-=doorSpeed; + if (!opening) { + int whichsound=(int)ofRandom(2.9999999); + sounds[whichsound].play(); + //sound.play(); + opening=true; + } + } + if (segTime>6) { + start(); + return true; } + else return false; } - + void trapdoor::draw() { glEnable(GL_DEPTH_TEST); ofSetHexColor(0xffffff); bindTexture(texture); ofPushMatrix(); - ofRotate(90,-1,0,0); - ofTranslate(ofVec3f(position.x,0,position.y)); + //ofRotate(90,-1,0,0); + ofTranslate(ofVec3f(position.x,position.y,0)); //ofRotate(180,-1,0,0); //for now size =40x40 - ofScale(.1,.1,.1); + ofRotate(90,-1,0,0); + ofScale(.15,.15,.15); surround.draw(); ofPushMatrix(); ofTranslate(90,0,0); diff --git a/gaunt01/src/trapdoor.h b/gaunt01/src/trapdoor.h index b1318b3..5975498 100644 --- a/gaunt01/src/trapdoor.h +++ b/gaunt01/src/trapdoor.h @@ -19,35 +19,43 @@ class trapdoor public: trapdoor(ofVec2f _boundTR=ofVec2f(0,0),ofVec2f _boundBR=ofVec2f(0,0),ofVec2f _doorSize=ofVec2f(10,10)); virtual ~trapdoor(); - - void checkUpdate(const vector& players); + + bool checkUpdate(const vector& players); void draw(); void start(); - + void startPos(ofVec2f pos); + vector getCorners(); ofVec2f bounds2UV(ofVec2f pt); - + + void setBoundingRect(float x,float y, float width,float height); + ofRectangle getBoundingRect(); + protected: private: morphmesh surround; morphmesh lid; - + ofVec2f position; ofVec2f boundTR; ofVec2f boundBR; ofVec2f size; - + float startTime; float triggerTime; //time threshold - + ofRectangle boundingRect; ofVec2f doorSize; - + float doorAngle; float doorSpeed; - + ofImage texture; - + + ofSoundPlayer* sounds; + + bool opening; + }; #endif // TRAPDOOR_H -- cgit v1.2.3