Transform LookAt(const Point &pos, const Point &look, const Vector &up) { float m[4][4]; // Initialize fourth column of viewing matrix m[0][3] = pos.x; m[1][3] = pos.y; m[2][3] = pos.z; m[3][3] = 1; // Initialize first three columns of viewing matrix Vector dir = Normalize(look - pos); if (Cross(Normalize(up), dir).Length() == 0) { Error("\"up\" vector (%f, %f, %f) and viewing direction (%f, %f, %f) " "passed to LookAt are pointing in the same direction. Using " "the identity transformation.", up.x, up.y, up.z, dir.x, dir.y, dir.z); return Transform(); } Vector left = Normalize(Cross(Normalize(up), dir)); Vector newUp = Cross(dir, left); m[0][0] = left.x; m[1][0] = left.y; m[2][0] = left.z; m[3][0] = 0.; m[0][1] = newUp.x; m[1][1] = newUp.y; m[2][1] = newUp.z; m[3][1] = 0.; m[0][2] = dir.x; m[1][2] = dir.y; m[2][2] = dir.z; m[3][2] = 0.; Matrix4x4 camToWorld(m); return Transform(Inverse(camToWorld), camToWorld); }
Transform LookAt(const Point &pos, const Point &look, const Vector &up) { float m[4][4]; // Initialize fourth column of viewing matrix m[0][3] = pos.x; m[1][3] = pos.y; m[2][3] = pos.z; m[3][3] = 1; // Initialize first three columns of viewing matrix Vector dir = Normalize(look - pos); Vector left = Normalize(Cross(Normalize(up), dir)); Vector newUp = Cross(dir, left); m[0][0] = left.x; m[1][0] = left.y; m[2][0] = left.z; m[3][0] = 0.; m[0][1] = newUp.x; m[1][1] = newUp.y; m[2][1] = newUp.z; m[3][1] = 0.; m[0][2] = dir.x; m[1][2] = dir.y; m[2][2] = dir.z; m[3][2] = 0.; Matrix4x4 camToWorld(m); return Transform(Inverse(camToWorld), camToWorld); }
Transform Transform::LookAt(const Point& pos, const Point& look, const Vector& up) { Vector forward = (look - pos).Normalize(); Vector left = up.Normalize().Cross(forward); Vector newUp = forward.Cross(left); float m[4][4]; m[0][0] = left.x; m[1][0] = left.y; m[2][0] = left.z; m[3][0] = 0; m[0][1] = newUp.x; m[1][1] = newUp.y; m[2][1] = newUp.z; m[3][1] = 0; m[0][2] = forward.x; m[1][2] = forward.y; m[2][2] = forward.z; m[3][2] = 0; m[0][3] = pos.x; m[1][3] = pos.y; m[2][3] = pos.z; m[3][3] = 1; Matrix4x4 camToWorld(m); return Transform(Matrix4x4::Inverse(camToWorld), camToWorld); }
Transform LookAt(const Point &pos, const Point &look, const Vector &up) { float m[4][4]; // Initialize fourth column of viewing matrix m[0][3] = pos.x; m[1][3] = pos.y; m[2][3] = pos.z; m[3][3] = 1; Vector dir = Normalize(look - pos); Vector right = Normalize(Cross(dir, up)); Vector newUp = Cross(right, dir); m[0][0] = right.x; m[1][0] = right.y; m[2][0] = right.z; m[3][0] = 0.; m[0][1] = newUp.x; m[1][1] = newUp.y; m[2][1] = newUp.z; m[3][1] = 0.; m[0][2] = dir.x; m[1][2] = dir.y; m[2][2] = dir.z; m[3][2] = 0.; Matrix4x4 camToWorld(m); return Transform(camToWorld.Inverse(), camToWorld); }
//! renvoie la transformation camera (View). Transform LookAt( const Point &pos, const Point &look, const Vector &up ) { float m[4][4]; #if 0 // import from pbrt-v2 // Initialize first three columns of viewing matrix Vector dir = Normalize(look - pos); Vector left = Cross(Normalize(up), dir); Vector newUp = Cross(dir, left); m[0][0] = left.x; m[1][0] = left.y; m[2][0] = left.z; m[3][0] = 0.f; m[0][1] = newUp.x; m[1][1] = newUp.y; m[2][1] = newUp.z; m[3][1] = 0.f; m[0][2] = dir.x; m[1][2] = dir.y; m[2][2] = dir.z; m[3][2] = 0.f; #endif #if 1 // pbrt-v1 // Initialize first three columns of viewing matrix Vector dir = Normalize( Vector(pos, look) ); Vector right = Normalize( Cross(dir, Normalize(up)) ); Vector newUp = Normalize( Cross(right, dir) ); m[0][0] = right.x; m[1][0] = right.y; m[2][0] = right.z; m[3][0] = 0.f; m[0][1] = newUp.x; m[1][1] = newUp.y; m[2][1] = newUp.z; m[3][1] = 0.f; m[0][2] = -dir.x; // opengl convention, look down the negative z axis m[1][2] = -dir.y; m[2][2] = -dir.z; m[3][2] = 0.f; #endif // Initialize fourth column of viewing matrix m[0][3] = pos.x; m[1][3] = pos.y; m[2][3] = pos.z; m[3][3] = 1.f; Matrix4x4 camToWorld(m); return Transform( camToWorld.getInverse(), camToWorld ); }
Transform LookAt(const pbrt::Point &pos, const pbrt::Point &look, const Vector &up) { float m[4][4]; // Initialize fourth column of viewing matrix m[0][3] = pos.x; m[1][3] = pos.y; m[2][3] = pos.z; m[3][3] = 1; // Left-hand coordinate system for the camera // Initialize first three columns of viewing matrix /* Vector dir = Normalize(look - pos); Vector left = Normalize(Cross(Normalize(up), dir)); Vector newUp = Cross(dir, left); m[0][0] = left.x; m[1][0] = left.y; m[2][0] = left.z; m[3][0] = 0.; m[0][1] = newUp.x; m[1][1] = newUp.y; m[2][1] = newUp.z; m[3][1] = 0.; m[0][2] = dir.x; m[1][2] = dir.y; m[2][2] = dir.z; m[3][2] = 0.; */ // Right-hand coordinate system for the camera Vector dir = -Normalize(look - pos); Vector right = Normalize( Cross(Normalize(up), dir)); Vector newUp = Cross(dir, right); m[0][0] = right.x; m[1][0] = right.y; m[2][0] = right.z; m[3][0] = 0.; m[0][1] = newUp.x; m[1][1] = newUp.y; m[2][1] = newUp.z; m[3][1] = 0.; m[0][2] = dir.x; m[1][2] = dir.y; m[2][2] = dir.z; m[3][2] = 0.; Matrix4x4 camToWorld(m); return Transform(Inverse(camToWorld), camToWorld); // LookAt() is the inverse to the camtoWorld transformation }
//-------------------------------------------------------------- void testApp::draw(){ // Display background ofSetColor(255, 255, 255, 50); img.draw(0, 0, ofGetWidth(), ofGetHeight()); // Draw ball ofSetColor(255, 150, 0); ofCircle(ballPositionX, ballPositionY, 10); /************ DRAW PARTICLE SYSTEM ***********************/ particleSystem.setTimeStep(timeStep); ofEnableAlphaBlending(); ofSetColor(251, 236, 93, lineOpacity); particleSystem.setupForces(); // apply per-particle forces glBegin(GL_LINES); for(int i = 0; i < particleSystem.size(); i++) { Particle& cur = particleSystem[i]; // global force on other particles particleSystem.addRepulsionForce(cur, particleNeighborhood, particleRepulsion); // forces on this particle cur.bounceOffWalls(0, 0, ofGetWidth(), ofGetHeight()); cur.addDampingForce(); } glEnd(); // Apply attraction to selected points for (int i=0; i < attractPts.size(); i++) { particleSystem.addAttractionForce(attractPts[i]->x, attractPts[i]->y, ofGetWidth(), centerAttraction); } // Add repulsion force by mouse click if(isMousePressed) particleSystem.addRepulsionForce(mouseX, mouseY, 100, 10); // Set the ball to repulse particleSystem.addRepulsionForce(ballPositionX, ballPositionY, 25, 10); particleSystem.update(); ofSetColor(255, 255, 255, pointOpacity); particleSystem.draw(); ofDisableAlphaBlending(); ofSetColor(255, 255, 255); //ofDrawBitmapString(ofToString(kParticles) + "k particles", 32, 32); //ofDrawBitmapString(ofToString((int) ofGetFrameRate()) + " fps", 32, 52); // draw depth and color view //kinect.drawDepth(10, 10, 200, 150); //kinect.draw(220, 10, 200, 150); //colorImg.mirror(false, true); //colorImg.draw(100,100); /************ DRAW POINT CLOUD ***********************/ // draw point cloud pointCloudX = 800; pointCloudY = 800; ofSetColor(0, 0, 0); ofPushMatrix(); ofTranslate(pointCloudX, pointCloudY); drawPointCloud(); ofPopMatrix(); // Make attraction with point /*for (int i=0; i < cloudPts.size(); i++) { particleSystem.addAttractionForce(cloudPts[i]->x + 800, cloudPts[i]->y + 650, 25, 1); //printf("Point Clouds: %f %f \n", cloudPts[i]->x, cloudPts[i]->y); } */ // Rotate drawing if(depthContours.blobs.size() == 2) { ofxVec2f center = depthContours.blobs[0].centroid + depthContours.blobs[1].centroid; ofxVec2f targetViewRot; targetViewRot.x = ofMap(center.x, 0, ofGetWidth(), -360, 360); targetViewRot.y = ofMap(center.y, 0, ofGetHeight(), 360, -360); viewRot += (targetViewRot - viewRot) * 0.05; } else { viewRot -= viewRot * 0.05; } ofxVec3f camToWorld(ofGetWidth()/depthOrig.getWidth(), ofGetHeight()/depthOrig.getHeight(), 1); ofxVec3f up(0, 1, 0); gui.draw(); /********** Calculate 2D Coordinate from 3D Space ********/ GLdouble screenX = 0; GLdouble screenY = 0; GLdouble screenZ = 0; GLint viewport[4]; GLdouble mvmatrix[16], projmatrix[16]; glGetIntegerv(GL_VIEWPORT, viewport); glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix); glGetDoublev(GL_PROJECTION_MATRIX, projmatrix); gluProject(pointCloudX, pointCloudY, -3000, mvmatrix, projmatrix, viewport, &screenX, &screenY, &screenZ); screenY = ofGetHeight() - screenY; // Draws contours on the screen depthContours.draw(screenX, screenY, 640, 480); }