码迷,mamicode.com
首页 > 其他好文 > 详细

[计算机图形学 with OpenGL] Chapter10 OpenGL三维观察程序示例

时间:2017-06-10 14:01:58      阅读:343      评论:0      收藏:0      [点我收藏+]

标签:double   min   log   mode   ide   不同   立方体   注意   ret   

  10.10节书中给出了一个程序示例,有一个填充正方形,从侧面的角度观察并画到屏幕上。

  技术分享图0

  这里进一步画出一个立方体,将相机放入立方体中心,旋转相机,达到在立方体中旋转看到不同画面的效果。

步骤:

  1 使用的是4.9节中的OpenGL顶点数组方法。创建一个立方体100*100*100,坐标范围(0, 0, 0)到(100, 100, 100)。

  2 立方体各面使用不同的颜色,调整顶点顺序以确保相机看到的都是填充面而不是线框图。

  3 将投影观察点(即观察系原点)设置在矩形中心P0 = (50, 50, 50)。

  4 视点Pref为相机朝向的点(注意,这个不是观察点),初始设置为Pref =(0, 50, 0)。

  5 修改Pref的坐标,使其绕x=z=50进行逆时针旋转(与y轴平行的旋转公式(9.9)),最终实现相机在立方体中逆时针旋转,看到不同面的效果。

备注:

  1 与y轴平行的旋转公式,先将旋转轴平移到与y轴重合,再进行旋转:z‘ = z * cosθ - x * sinθ, x‘ = z * sinθ + x * cosθ, y‘=y;

  2 近平面距离投影观察点不能为0,近平面和远平面的坐标会影响画面的效果,调整范围以确保画面不太离谱(并不真实)

问题:这个投影效果看起来并不真实。

  1 调整dnear和dfar时,会影响投影效果。dnear离P0越近,投影效果强度更大,离得远的点看着更小。见图2。

  2 当调整近裁剪面大小且当立方体旋转时,投影画面会改变宽度,看起来会更奇怪。见图3。

 

技术分享
  1 include <GLUT/GLUT.h>
  2 #include <math.h>
  3 
  4 GLint winWidth = 600, winHeight = 600;
  5 GLfloat x0 = 50.0, y00 = 50.0, z0 = 50.0; // 这是观察参考点,与观察系原点重合
  6 GLfloat xref = 0.0, yref = 50.0, zref = 0.0; // camera要瞄准的点,不是观察参考点
  7 GLfloat Vx = 0.0, Vy = 1.0, Vz = 0.0;
  8 GLfloat xwMin = -40.0, ywMin = -40.0, xwMax = 40.0, ywMax = 40.0;
  9 GLfloat dnear = 25, dfar = 75;
 10 GLdouble radianAngle = 1.0/360.0 * 3.14159;
 11 GLfloat cos1 = cos(radianAngle);
 12 GLfloat sin1 = sin(radianAngle);
 13 
 14 typedef GLint vertex3 [3];
 15 vertex3 pt [8] = {{0, 0, 0}, {0, 100, 0}, {100, 0, 0}, {100, 100, 0},
 16                 {0, 0, 100}, {0, 100, 100}, {100, 0, 100}, {100, 100, 100}};
 17 
 18 void init (void)
 19 {
 20     glClearColor(1.0, 1.0, 1.0, 0.0);
 21     
 22     glMatrixMode(GL_MODELVIEW);
 23     gluLookAt(x0, y00, z0, xref, yref, zref, Vx, Vy, Vz);
 24     
 25     glMatrixMode(GL_PROJECTION);
 26     glFrustum(xwMin, xwMax, ywMin, ywMax, dnear, dfar);
 27 }
 28 
 29 void quad (GLint n1, GLint n2, GLint n3, GLint n4)
 30 {
 31     glBegin(GL_QUADS);
 32     glVertex3iv(pt[n1]);
 33     glVertex3iv(pt[n2]);
 34     glVertex3iv(pt[n3]);
 35     glVertex3iv(pt[n4]);
 36     glEnd();
 37 }
 38 
 39 void cube ()
 40 {
 41     glColor3f(0.0, 1.0, 0.0); // back
 42     quad(0, 2, 3, 1);
 43     glColor3f(1.0, 0.0, 0.0); // left
 44     quad(0, 1, 5, 4);
 45     glColor3f(0.0, 0.0, 1.0); // top
 46     quad(1, 3, 7, 5);
 47     glColor3f(1.0, 1.0, 0.0); // front
 48     quad(4, 5, 7, 6);
 49     glColor3f(0.0, 1.0, 1.0); // right
 50     quad(2, 6, 7, 3);
 51     glColor3f(1.0, 0.0, 1.0); // bottom
 52     quad(0, 4, 6, 2);
 53 }
 54 
 55 void displayFcn (void)
 56 {
 57     glClear(GL_COLOR_BUFFER_BIT);
 58     
 59     glColor3f(0.0, 1.0, 0.0);
 60     glPolygonMode(GL_FRONT, GL_FILL);
 61     glPolygonMode(GL_BACK, GL_LINE);
 62 //    glFrontFace(GL_CW); // show the back
 63     
 64     cube();
 65     
 66     glutSwapBuffers();
 67 }
 68 
 69 void reshapeFcn (GLint newWidth, GLint newHeight)
 70 {
 71     glViewport(0, 0, newWidth, newHeight);
 72     
 73     winWidth = newWidth;
 74     winHeight = newHeight;
 75 }
 76 
 77 void idleFcn (void)
 78 {
 79     GLfloat xref1, zref1;
 80     xref = xref - x0;
 81     zref = zref - z0;
 82     zref1 = zref * cos1 - xref * sin1 + z0;
 83     xref1 = zref * sin1 + xref * cos1 + x0;
 84     xref = xref1;
 85     zref = zref1;
 86     
 87     glMatrixMode(GL_MODELVIEW);
 88     glLoadIdentity();
 89     gluLookAt(x0, y00, z0, xref, yref, zref, Vx, Vy, Vz);
 90     
 91     displayFcn();
 92 }
 93 
 94 int main(int argc, char * argv[])
 95 {
 96     glutInit(&argc, argv);
 97     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
 98     glutInitWindowSize(winWidth, winHeight);
 99     glutInitWindowPosition(50, 50);
100     glutCreateWindow("Perspective View of A Square");
101     
102     init();
103     glutDisplayFunc(displayFcn);
104     glutReshapeFunc(reshapeFcn);
105     glutIdleFunc(idleFcn);
106     glutMainLoop();
107     
108     return 0;
109 }
View Code

技术分享图1  技术分享图2  技术分享图3

 

[计算机图形学 with OpenGL] Chapter10 OpenGL三维观察程序示例

标签:double   min   log   mode   ide   不同   立方体   注意   ret   

原文地址:http://www.cnblogs.com/p0e0o0p0l0e0/p/6978225.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!