Ray Camera::generateRay( float uPos, float vPos, float imagePlaneApectRatio ) const { calcMatrices(); float s = ( uPos - 0.5f ) * imagePlaneApectRatio; float t = ( vPos - 0.5f ); float viewDistance = imagePlaneApectRatio / math<float>::abs( mFrustumRight - mFrustumLeft ) * mNearClip; return Ray( mEyePoint, ( mU * s + mV * t - ( mW * viewDistance ) ).normalized() ); }
void Camera::getFrustum( float *left, float *top, float *right, float *bottom, float *near, float *far ) const { calcMatrices(); *left = mFrustumLeft; *top = mFrustumTop; *right = mFrustumRight; *bottom = mFrustumBottom; *near = mNearClip; *far = mFarClip; }
void Camera::getNearClipCoordinates( vec3 *topLeft, vec3 *topRight, vec3 *bottomLeft, vec3 *bottomRight ) const { calcMatrices(); vec3 viewDirection = normalize( mViewDirection ); *topLeft = mEyePoint + (mNearClip * viewDirection) + (mFrustumTop * mV) + (mFrustumLeft * mU); *topRight = mEyePoint + (mNearClip * viewDirection) + (mFrustumTop * mV) + (mFrustumRight * mU); *bottomLeft = mEyePoint + (mNearClip * viewDirection) + (mFrustumBottom * mV) + (mFrustumLeft * mU); *bottomRight = mEyePoint + (mNearClip * viewDirection) + (mFrustumBottom * mV) + (mFrustumRight * mU); }
void Camera::getFarClipCoordinates( Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight ) const { calcMatrices(); Vec3f viewDirection( mViewDirection ); viewDirection.normalize(); float ratio = mFarClip / mNearClip; *topLeft = mEyePoint + (mFarClip * viewDirection) + (ratio * mFrustumTop * mV) + (ratio * mFrustumLeft * mU); *topRight = mEyePoint + (mFarClip * viewDirection) + (ratio * mFrustumTop * mV) + (ratio * mFrustumRight * mU); *bottomLeft = mEyePoint + (mFarClip * viewDirection) + (ratio * mFrustumBottom * mV) + (ratio * mFrustumLeft * mU); *bottomRight = mEyePoint + (mFarClip * viewDirection) + (ratio * mFrustumBottom * mV) + (ratio * mFrustumRight * mU); }
void CameraStereo::getNearClipCoordinates( vec3 *topLeft, vec3 *topRight, vec3 *bottomLeft, vec3 *bottomRight ) const { calcMatrices(); vec3 viewDirection = normalize( mViewDirection ); vec3 eye( getEyePointShifted() ); float shift = 0.5f * mEyeSeparation * (mNearClip / mConvergence); shift *= (mIsStereo ? (mIsLeft ? 1.0f : -1.0f) : 0.0f); float left = mFrustumLeft + shift; float right = mFrustumRight + shift; *topLeft = eye + (mNearClip * viewDirection) + (mFrustumTop * mV) + (left * mU); *topRight = eye + (mNearClip * viewDirection) + (mFrustumTop * mV) + (right * mU); *bottomLeft = eye + (mNearClip * viewDirection) + (mFrustumBottom * mV) + (left * mU); *bottomRight = eye + (mNearClip * viewDirection) + (mFrustumBottom * mV) + (right * mU); }