//---------------------------------------- void ofCamera::setupPerspective(bool vFlip, float fov, float nearDist, float farDist, const ofVec2f & lensOffset){ float viewW = ofGetViewportWidth(); float viewH = ofGetViewportHeight(); float eyeX = viewW / 2; float eyeY = viewH / 2; float halfFov = PI * fov / 360; float theTan = tanf(halfFov); float dist = eyeY / theTan; if(nearDist == 0) nearDist = dist / 10.0f; if(farDist == 0) farDist = dist * 10.0f; setFov(fov); setNearClip(nearDist); setFarClip(farDist); setLensOffset(lensOffset); setForceAspectRatio(false); setPosition(eyeX,eyeY,dist); lookAt(ofVec3f(eyeX,eyeY,0),ofVec3f(0,1,0)); if(vFlip){ setScale(1,-1,1); } }
//---------------------------------------- void ofCamera::setupPerspective(bool _vFlip, float fov, float nearDist, float farDist, const ofVec2f & lensOffset){ ofRectangle orientedViewport = ofGetNativeViewport(); float eyeX = orientedViewport.width / 2; float eyeY = orientedViewport.height / 2; float halfFov = PI * fov / 360; float theTan = tanf(halfFov); float dist = eyeY / theTan; if(nearDist == 0) nearDist = dist / 10.0f; if(farDist == 0) farDist = dist * 10.0f; setFov(fov); setNearClip(nearDist); setFarClip(farDist); setLensOffset(lensOffset); setForceAspectRatio(false); setPosition(eyeX,eyeY,dist); lookAt(ofVec3f(eyeX,eyeY,0),ofVec3f(0,1,0)); vFlip = _vFlip; }
//---------------------------------------- void ofCamera::setupOffAxisViewPortal(const ofVec3f & topLeft, const ofVec3f & bottomLeft, const ofVec3f & bottomRight){ ofVec3f bottomEdge = bottomRight - bottomLeft; // plane x axis ofVec3f leftEdge = topLeft - bottomLeft; // plane y axis ofVec3f bottomEdgeNorm = bottomEdge.getNormalized(); ofVec3f leftEdgeNorm = leftEdge.getNormalized(); ofVec3f bottomLeftToCam = this->getPosition() - bottomLeft; ofVec3f cameraLookVector = leftEdgeNorm.getCrossed(bottomEdgeNorm); ofVec3f cameraUpVector = bottomEdgeNorm.getCrossed(cameraLookVector); lookAt(cameraLookVector + this->getPosition(), cameraUpVector); //lensoffset ofVec2f lensOffset; lensOffset.x = -bottomLeftToCam.dot(bottomEdgeNorm) * 2.0f / bottomEdge.length() + 1.0f; lensOffset.y = -bottomLeftToCam.dot(leftEdgeNorm) * 2.0f / leftEdge.length() + 1.0f; setLensOffset(lensOffset); setAspectRatio( bottomEdge.length() / leftEdge.length() ); float distanceAlongOpticalAxis = abs(bottomLeftToCam.dot(cameraLookVector)); setFov(2.0f * RAD_TO_DEG * atan( (leftEdge.length() / 2.0f) / distanceAlongOpticalAxis)); }