void ofApp::update() { if (trackingEnabled) { videoGrabber.update(); if (videoGrabber.isFrameNew()) { tracker.update(ofxCv::toCv(videoGrabber)); const ofVec2f& trackerPos = tracker.getPosition(); ofVec2f newCamPos((videoGrabber.getWidth()/2) - trackerPos.x, (videoGrabber.getHeight()/2 - trackerPos.y)); cam.setPosition((newCamPos.x + trackerOffset.x) * trackerSensitivityX, (newCamPos.y + trackerOffset.y) * trackerSensitivityY, camZ - tracker.getScale() * trackerSensitivityZ); } } else { cam.setPosition(camXY->getScaledValue().x, camXY->getScaledValue().y, camZ); } cam.update(); }
void ScatterSky::_getColor( const Point3F &pos, ColorF *outColor ) { PROFILE_SCOPE( ScatterSky_GetColor ); F32 scaleOverScaleDepth = mScale / mRayleighScaleDepth; F32 rayleighBrightness = mRayleighScattering * mSkyBrightness; F32 mieBrightness = mMieScattering * mSkyBrightness; Point3F invWaveLength( 1.0f / mWavelength4[0], 1.0f / mWavelength4[1], 1.0f / mWavelength4[2] ); Point3F v3Pos = pos / 6378000.0f; v3Pos.z += mSphereInnerRadius; Point3F newCamPos( 0, 0, smViewerHeight ); VectorF v3Ray = v3Pos - newCamPos; F32 fFar = v3Ray.len(); v3Ray / fFar; v3Ray.normalizeSafe(); Point3F v3Start = newCamPos; F32 fDepth = mExp( scaleOverScaleDepth * (mSphereInnerRadius - smViewerHeight ) ); F32 fStartAngle = mDot( v3Ray, v3Start ); F32 fStartOffset = fDepth * _vernierScale( fStartAngle ); F32 fSampleLength = fFar / 2.0f; F32 fScaledLength = fSampleLength * mScale; VectorF v3SampleRay = v3Ray * fSampleLength; Point3F v3SamplePoint = v3Start + v3SampleRay * 0.5f; Point3F v3FrontColor( 0, 0, 0 ); for ( U32 i = 0; i < 2; i++ ) { F32 fHeight = v3SamplePoint.len(); F32 fDepth = mExp( scaleOverScaleDepth * (mSphereInnerRadius - smViewerHeight) ); F32 fLightAngle = mDot( mLightDir, v3SamplePoint ) / fHeight; F32 fCameraAngle = mDot( v3Ray, v3SamplePoint ) / fHeight; F32 fScatter = (fStartOffset + fDepth * ( _vernierScale( fLightAngle ) - _vernierScale( fCameraAngle ) )); Point3F v3Attenuate( 0, 0, 0 ); F32 tmp = mExp( -fScatter * (invWaveLength[0] * mRayleighScattering4PI + mMieScattering4PI) ); v3Attenuate.x = tmp; tmp = mExp( -fScatter * (invWaveLength[1] * mRayleighScattering4PI + mMieScattering4PI) ); v3Attenuate.y = tmp; tmp = mExp( -fScatter * (invWaveLength[2] * mRayleighScattering4PI + mMieScattering4PI) ); v3Attenuate.z = tmp; v3FrontColor += v3Attenuate * (fDepth * fScaledLength); v3SamplePoint += v3SampleRay; } Point3F mieColor = v3FrontColor * mieBrightness; Point3F rayleighColor = v3FrontColor * (invWaveLength * rayleighBrightness); Point3F v3Direction = newCamPos - v3Pos; v3Direction.normalize(); F32 fCos = mDot( mLightDir, v3Direction ) / v3Direction.len(); F32 fCos2 = fCos * fCos; F32 g = -0.991f; F32 g2 = g * g; F32 miePhase = _getMiePhase( fCos, fCos2, g, g2 ); Point3F color = rayleighColor + (miePhase * mieColor); ColorF tmp( color.x, color.y, color.z, color.y ); Point3F expColor( 0, 0, 0 ); expColor.x = 1.0f - exp(-mExposure * color.x); expColor.y = 1.0f - exp(-mExposure * color.y); expColor.z = 1.0f - exp(-mExposure * color.z); tmp.set( expColor.x, expColor.y, expColor.z, 1.0f ); if ( !tmp.isValidColor() ) { F32 len = expColor.len(); if ( len > 0 ) expColor /= len; } outColor->set( expColor.x, expColor.y, expColor.z, 1.0f ); }