void Camera::calculateViewingTransformParameters() { // compute new transformation based on // user interaction Mat4f dollyXform; Mat4f azimXform; Mat4f elevXform; Mat4f twistXform; Mat4f originXform; Vec3f upVector; MakeHTrans(dollyXform, Vec3f(0,0,mDolly)); MakeHRotY(azimXform, mAzimuth); MakeHRotX(elevXform, mElevation); MakeDiagonal(twistXform, 1.0f); MakeHTrans(originXform, mLookAt); mPosition = Vec3f(0,0,0); mPosition = originXform * (azimXform * (elevXform * (dollyXform * mPosition))); if ( fmod(double(mElevation), 2.0*M_PI) < -M_PI/2 || fmod(double(mElevation), 2.0*M_PI) > M_PI/2 ) mUpVector= Vec3f(0,-1,0); else mUpVector= Vec3f(0,1,0); mDirtyTransform = false; }
void Camera::calculateViewingTransformParameters() { Mat4f dollyXform; Mat4f azimXform; Mat4f elevXform; Mat4f twistXform; Mat4f originXform; Vec3f upVector; MakeHTrans(dollyXform, Vec3f(0,0,mDolly)); MakeHRotY(azimXform, mAzimuth); MakeHRotX(elevXform, mElevation); MakeDiagonal(twistXform, 1.0f); MakeHTrans(originXform, mLookAt); mPosition = Vec3f(0,0,0); // grouped for (mat4 * vec3) ops instead of (mat4 * mat4) ops mPosition = originXform * (azimXform * (elevXform * (dollyXform * mPosition))); if ( fmod((double)mElevation, 2.0*M_PI) < 3*M_PI/2 && fmod((double)mElevation, 2.0*M_PI) > M_PI/2 ) mUpVector= Vec3f(0,-1,0); else mUpVector= Vec3f(0,1,0); mDirtyTransform = false; }
void Camera::calculateViewingTransformParameters() { Mat4f dollyXform; Mat4f azimXform; Mat4f elevXform; Mat4f twistXform; Mat4f originXform; MakeHTrans(dollyXform, Vec3f(0,0,mDolly)); MakeHRotY(azimXform, mAzimuth); MakeHRotX(elevXform, mElevation); MakeDiagonal(twistXform, 1.0f); MakeHTrans(originXform, mLookAt); mPosition = Vec3f(0,0,0); // grouped for (mat4 * vec3) ops instead of (mat4 * mat4) ops mPosition = originXform * (azimXform * (elevXform * (dollyXform * mPosition))); Vec3f nx = originXform * (azimXform * (elevXform * (dollyXform * Vec3f(1, 0, 0)))); Vec3f ny = originXform * (azimXform * (elevXform * (dollyXform * Vec3f(0, 1, 0)))); mUpVector = nx*sin(mTwist) + ny*cos(mTwist); mDirtyTransform = false; }