static TQ3CameraObject QD3DSupport_NewCamera(float docWidth, float docHeight) { TQ3ViewAngleAspectCameraData perspectiveData; TQ3CameraObject camera; TQ3Point3D from = { 30.0F, 50.0F, -50.0F }; TQ3Point3D to = { 30.0F, 0.0F, 0.0F }; TQ3Vector3D up = { 0.0F, 1.0F, 0.0F }; float fieldOfView = 1.2F; float hither = 0.2F; float yon = 200.0F; perspectiveData.cameraData.placement.cameraLocation = from; perspectiveData.cameraData.placement.pointOfInterest = to; perspectiveData.cameraData.placement.upVector = up; perspectiveData.cameraData.range.hither = hither; perspectiveData.cameraData.range.yon = yon; perspectiveData.cameraData.viewPort.origin.x = -1.0F; perspectiveData.cameraData.viewPort.origin.y = 1.0F; perspectiveData.cameraData.viewPort.width = 2.0F; perspectiveData.cameraData.viewPort.height = 2.0F; perspectiveData.fov = fieldOfView; perspectiveData.aspectRatioXToY = docWidth / docHeight; camera = Q3ViewAngleAspectCamera_New(&perspectiveData); return camera ; }
TQ3CameraObject MyNewCamera(DocumentPtr theDocument) { TQ3ViewAngleAspectCameraData perspectiveData; TQ3CameraObject camera; TQ3Point3D from = { 0.0F, 0.0F, 7.0F }; TQ3Point3D to = { 0.0F, 0.0F, 0.0F }; TQ3Vector3D up = { 0.0F, 1.0F, 0.0F }; float fieldOfView = 1.0F; float hither = 0.001F; float yon = 1000.0F; TQ3Status returnVal = kQ3Failure ; perspectiveData.cameraData.placement.cameraLocation = from; perspectiveData.cameraData.placement.pointOfInterest = to; perspectiveData.cameraData.placement.upVector = up; perspectiveData.cameraData.range.hither = hither; perspectiveData.cameraData.range.yon = yon; perspectiveData.cameraData.viewPort.origin.x = -1.0F; perspectiveData.cameraData.viewPort.origin.y = 1.0F; perspectiveData.cameraData.viewPort.width = 2.0F; perspectiveData.cameraData.viewPort.height = 2.0F; perspectiveData.fov = fieldOfView; perspectiveData.aspectRatioXToY = (float) (theDocument->fWidth) / (float) (theDocument->fHeight); camera = Q3ViewAngleAspectCamera_New(&perspectiveData); return camera ; }
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); } } } } }