/*===========================================================================*\ * * Routine: RT_SetCamera() * * Comments: Sets the camera * \*===========================================================================*/ TQ3Status RT_SetCamera(TRTDrawContext * /*inContext*/, TQ3Point3D *inCameraLocation,TQ3Point3D *inPointOfInterests, TQ3Vector3D *inUpVector,double minfov, double aspectRatioXToY) { Camera.pos.x = inCameraLocation->x; Camera.pos.y = inCameraLocation->y; Camera.pos.z = inCameraLocation->z; Camera.up.x = inUpVector->x; Camera.up.y = inUpVector->y; Camera.up.z = inUpVector->z; Camera.lookp.x = inPointOfInterests->x; Camera.lookp.y = inPointOfInterests->y; Camera.lookp.z = inPointOfInterests->z; /* * Calculate hfov and vfov */ if (aspectRatioXToY <= 1.0) { Camera.hfov = Q3Math_RadiansToDegrees(minfov); Camera.vfov = Q3Math_RadiansToDegrees( atan( tan( minfov * 0.5 ) / aspectRatioXToY ) * 2.0 ); } else { Camera.vfov = Q3Math_RadiansToDegrees(minfov); Camera.hfov = Q3Math_RadiansToDegrees( atan( tan( minfov * 0.5 ) * aspectRatioXToY ) * 2.0 ); } return kQ3Success; }
void pvCamera_Fit(DocumentPtr theDocument) { TQ3Point3D from, to; TQ3BoundingBox viewBBox; float fieldOfView, hither, yon; if (!theDocument) return; if (!theDocument->fModel) return; pvBBox_Get(theDocument, &viewBBox); pvBBoxCenter(&viewBBox, &to); { TQ3Vector3D viewVector; TQ3Vector3D normViewVector; TQ3Vector3D eyeToFrontClip; TQ3Vector3D eyeToBackClip; TQ3Vector3D diagonalVector; float viewDistance; float maxDimension; Q3Point3D_Subtract(&viewBBox.max, &viewBBox.min, &diagonalVector); maxDimension = Q3Vector3D_Length(&diagonalVector); if (maxDimension == 0.0F) maxDimension = 1.0F; maxDimension *= 8.0F / 7.0F; from.x = to.x; from.y = to.y; from.z = to.z + (2 * maxDimension); Q3Point3D_Subtract(&to, &from, &viewVector); viewDistance = Q3Vector3D_Length(&viewVector); Q3Vector3D_Normalize(&viewVector, &normViewVector); maxDimension /= 2.0F; Q3Vector3D_Scale(&normViewVector, viewDistance - maxDimension, &eyeToFrontClip); Q3Vector3D_Scale(&normViewVector, viewDistance + maxDimension, &eyeToBackClip); hither = Q3Vector3D_Length(&eyeToFrontClip); yon = Q3Vector3D_Length(&eyeToBackClip); fieldOfView = Q3Math_RadiansToDegrees(1.25 * ErMath_Atan(maxDimension/hither)); } { TQ3ViewAngleAspectCameraData data; TQ3Vector3D up = { 0.0F, 1.0F, 0.0F }; data.cameraData.placement.cameraLocation = from; data.cameraData.placement.pointOfInterest = to; data.cameraData.placement.upVector = up; data.cameraData.range.hither = hither; data.cameraData.range.yon = yon; data.cameraData.viewPort.origin.x = -1.0F; data.cameraData.viewPort.origin.y = 1.0F; data.cameraData.viewPort.width = 2.0F; data.cameraData.viewPort.height = 2.0F; data.fov = Q3Math_DegreesToRadians(fieldOfView); { float w = (float)(theDocument->fWidth); float h = (float)(theDocument->fHeight); data.aspectRatioXToY = w/h; } if (theDocument->fView) { TQ3CameraObject camera; Q3View_GetCamera(theDocument->fView, &camera); if (camera) { Q3ViewAngleAspectCamera_SetData(camera, &data); Q3Object_Dispose(camera); } else { camera = Q3ViewAngleAspectCamera_New (&data); if (camera) { Q3View_SetCamera (theDocument->fView, camera); Q3Object_Dispose(camera); } } } } }