我要发帖 回复

中级会员

7

主题

124

积分

0

专家分

:

私信
发表时间 : 2008-7-18 16:55:24 | 浏览 : 2127    评论 : 4
在红皮书里头有这么个程序:clip.c

[cpp]#include <GL/glut.h>
#include <stdlib.h>

void init(void)
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
}

void display(void)
{
   GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};     //plane is y=0
   GLdouble eqn2[4] = {1.0, 0.0, 0.0, 0.0};    //plane is x=0

   glClear(GL_COLOR_BUFFER_BIT);

   glColor3f (1.0, 1.0, 1.0);
  
   glPushMatrix();
   glTranslatef (0.0, 0.0, -5.0);

/*    clip lower half -- y < 0          */
   glClipPlane (GL_CLIP_PLANE0, eqn);
   glEnable (GL_CLIP_PLANE0);
/*    clip left half -- x < 0           */
   glClipPlane (GL_CLIP_PLANE1, eqn2);
   glEnable (GL_CLIP_PLANE1);
   
   glRotatef (90.0, 1.0, 0.0, 0.0);   
   glutWireSphere(1.0, 20, 16);   

   glPopMatrix();

   glFlush ();
}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
   glMatrixMode (GL_MODELVIEW);
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
   }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (500, 500);
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}
[/cpp]
其运行的结果是:
the result.jpg
请问:
glTranslatef (0.0, 0.0, -5.0);  
glRotatef (90.0, 1.0, 0.0, 0.0);
这两个函数位置为什么那么放(剪切面介于他们之间,把剪切面放在glTranslatef (0.0, 0.0, -5.0);之前是不是也可以),这两个函数对剪切面有影响吗,
我把变换理解成:
剪切面不受局部坐标变换的影响,在视点坐标系下对圆进行裁剪,
以上变换为对对象局部坐标系进行做变换,局部坐标系沿z轴负方向移动5,对象沿局部坐标系的x轴逆时针旋转90度,则此时被裁剪的1/4圆在窗口显示的图形我认为是:上面的图沿x轴逆时针旋转90,如此图: 我认为的结果.jpg

请问一下我错在哪?应该怎么理解?请大家帮忙一下,谢谢了!!
对了,还有一个问题: 为什么剪切的是y < 0和 x < 0 的部分,是函数规定的是吗?那如果剪切面是倾斜的呢?

最近VR访客

tan_dunming 评论于2008-7-29 09:49:55
“剪切面不受局部坐标变换的影响,在视点坐标系下对圆进行裁剪”——我也这么理解
“以上变换为对对象局部坐标系进行做变换,局部坐标系沿z轴负方向移动5,对象沿局部坐标系的x轴逆时针旋转90度,则此时被裁剪的1/4圆在窗口显示的图形我认为是:上面的图沿x轴逆时针旋转90,”——应该是顺时针吧?

既然你也认为“剪切面不受局部坐标变换的影响,在视点坐标系下对圆进行裁剪”,那么显示的结果就不应该是那样了吧?

GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};     //plane is y=0   
GLdouble eqn2[4] = {1.0, 0.0, 0.0, 0.0};    //plane is x=0  
数组中的四个浮点数分别是平面方程AX+BY+CZ+D=0的四个系数
追求卓越
gqd2006 评论于2008-7-29 21:04:21

回复2#的帖子

谢谢版主的解答!!自己还是没能理解
不过发现了自己的一个错误,我发现我把圆的建立理解错了,我把圆的极点理解成在y轴上,实际上应该在z轴上,是这样的吧?
我把glRotatef (90.0, 1.0, 0.0, 0.0)删了看了一下,图形是这样的
clip_image002.jpg

该图形的纬线全部被切断了,无论怎么旋转怎么会有完整的纬线呢,而第一幅正确结果的图中的纬线却是完整的,还是不能理解

能不能麻烦版主把你看的过程给解释一下啊,谢谢版主了!!
还有,行的话能不能把各个变换矩阵还有剪切面矩阵也图形矩阵相乘的大致顺序给写一下啊,麻烦版主了哈
tan_dunming 评论于2008-7-29 22:38:21
你是想做一个天空盒吗?

void display(void)
{
   GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};
   GLdouble eqn2[4] = {1.0, 0.0, 0.0, 0.0};

   glClear(GL_COLOR_BUFFER_BIT);

   glColor3f (1.0, 1.0, 1.0);
   glPushMatrix();
   glTranslatef (0.0, 0.0, -5.0);

/*    clip lower half -- y < 0          */
   glClipPlane (GL_CLIP_PLANE0, eqn);
   glEnable (GL_CLIP_PLANE0);
/*    clip left half -- x < 0           */
   //glClipPlane (GL_CLIP_PLANE1, eqn2);
   //glEnable (GL_CLIP_PLANE1);

   glRotatef (90.0, 1.0, 0.0, 0.0);
   glutWireSphere(1.0, 20, 16);
   glPopMatrix();

   glFlush ();
}

注释掉一下两句:
   //glClipPlane (GL_CLIP_PLANE1, eqn2);
   //glEnable (GL_CLIP_PLANE1);
追求卓越
gqd2006 评论于2008-7-30 17:38:58

回复 4# 的帖子

我不是要要做天空盒,就是不理解矩阵计算过程是什么样的
我让图形绕x轴做360度动态旋转后,终于明白自己错哪里了
现在才知道:图形在用局部坐标系理解时是先进行各个变换,然后剪切面才作用的,我一开始理解成图形先剪切,剪切完后才进行对象绕局部坐标变换;或者说剪切的是视景体而不是剪切图形对象
书没理解清楚

[ 本帖最后由 gqd2006 于 2008-7-30 06:08 PM 编辑 ]

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-8-3 03:29 PM

返回顶部