accpersp.c
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:4k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  * (c) Copyright 1993, Silicon Graphics, Inc.
  3.  * ALL RIGHTS RESERVED 
  4.  * Permission to use, copy, modify, and distribute this software for 
  5.  * any purpose and without fee is hereby granted, provided that the above
  6.  * copyright notice appear in all copies and that both the copyright notice
  7.  * and this permission notice appear in supporting documentation, and that 
  8.  * the name of Silicon Graphics, Inc. not be used in advertising
  9.  * or publicity pertaining to distribution of the software without specific,
  10.  * written prior permission. 
  11.  *
  12.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  13.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  14.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  15.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  16.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  17.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  18.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  19.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  20.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  21.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  22.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  23.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  24.  * 
  25.  * US Government Users Restricted Rights 
  26.  * Use, duplication, or disclosure by the Government is subject to
  27.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  28.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  29.  * clause at DFARS 252.227-7013 and/or in similar or successor
  30.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  31.  * Unpublished-- rights reserved under the copyright laws of the
  32.  * United States.  Contractor/manufacturer is Silicon Graphics,
  33.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  34.  *
  35.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  36.  */
  37. /*  accpersp.c
  38.  */
  39. #ifdef __cplusplus
  40. this is weird; but MSVC likes it; and wont link from the IDE without it;
  41. #endif
  42. #ifdef WIN32
  43. # include "winGLdecs.h"
  44. #endif
  45. #include <GL/gl.h>
  46. #include <GL/glu.h>
  47. #include <math.h>
  48. #define PI_ 3.14159265358979323846
  49. /* accFrustum()
  50.  *  The first 6 arguments are identical to the glFrustum() call.
  51.  *  
  52.  *  pixdx and pixdy are anti-alias jitter in pixels. 
  53.  *  Set both equal to 0.0 for no anti-alias jitter.
  54.  *  eyedx and eyedy are depth-of field jitter in pixels. 
  55.  *  Set both equal to 0.0 for no depth of field effects.
  56.  *
  57.  *  focus is distance from eye to plane in focus. 
  58.  *  focus must be greater than, but not equal to 0.0.
  59.  *
  60.  *  Note that accFrustum() calls glTranslatef().  You will 
  61.  *  probably want to insure that your ModelView matrix has been 
  62.  *  initialized to identity before calling accFrustum().
  63.  */
  64. void accFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,
  65.     GLdouble znear, GLdouble zfar, GLdouble pixdx, GLdouble pixdy, 
  66.     GLdouble eyedx, GLdouble eyedy, GLdouble focus)
  67. {
  68.     GLdouble xwsize, ywsize; 
  69.     GLdouble dx, dy;
  70.     GLint viewport[4];
  71.     glGetIntegerv (GL_VIEWPORT, viewport);
  72.     xwsize = right - left;
  73.     ywsize = top - bottom;
  74.     dx = -(pixdx*xwsize/(GLdouble) viewport[2] + eyedx*znear/focus);
  75.     dy = -(pixdy*ywsize/(GLdouble) viewport[3] + eyedy*znear/focus);
  76.     glMatrixMode(GL_PROJECTION);
  77.     glLoadIdentity();
  78.     glFrustum (left + dx, right + dx, bottom + dy, top + dy, znear, zfar);
  79.     glMatrixMode(GL_MODELVIEW);
  80.     glLoadIdentity();
  81.     glTranslatef (-eyedx, -eyedy, 0.0);
  82. }
  83. /*  accPerspective()
  84.  * 
  85.  *  The first 4 arguments are identical to the gluPerspective() call.
  86.  *  pixdx and pixdy are anti-alias jitter in pixels. 
  87.  *  Set both equal to 0.0 for no anti-alias jitter.
  88.  *  eyedx and eyedy are depth-of field jitter in pixels. 
  89.  *  Set both equal to 0.0 for no depth of field effects.
  90.  *
  91.  *  focus is distance from eye to plane in focus. 
  92.  *  focus must be greater than, but not equal to 0.0.
  93.  *
  94.  *  Note that accPerspective() calls accFrustum().
  95.  */
  96. void accPerspective(GLdouble fovy, GLdouble aspect, 
  97.     GLdouble znear, GLdouble zfar, GLdouble pixdx, GLdouble pixdy, 
  98.     GLdouble eyedx, GLdouble eyedy, GLdouble focus)
  99. {
  100.     GLdouble fov2,left,right,bottom,top;
  101.     fov2 = ((fovy*PI_) / 180.0) / 2.0;
  102.     top = znear / (cos(fov2) / sin(fov2));
  103.     bottom = -top;
  104.     right = top * aspect;
  105.     left = -right;
  106.     accFrustum (left, right, bottom, top, znear, zfar,
  107. pixdx, pixdy, eyedx, eyedy, focus);
  108. }
  109.