在OpenGL里的附加平面裁剪函数void glClipPlane(GLenum plane,Const GLdouble *equation);其中参数equation指向一个拥有四个系数值的数组,这四个系数分别是裁剪平面Ax+By+Cz+D=0的A、B、C、D值,即系A,B,C,D系如何确定一个裁剪面啊?

解决方案 »

  1.   

    空间任意不过一条直线的三点(A,B,C)都可以确定这个方程。
    先A-B,B-C
    然后(A-B)与(B-C)做叉乘。得到平面的法矢量
    接着在A,B,C中任取一点,带入法矢量就可以得到平面方程。
      

  2.   

    如果我要实现以下功能,应该如何确定载剪面:在屏幕中间有一个网格球体,输入一个点
    P(x,y,z),以垂直于Y轴且经过点P的平面为载翦面,用glClipPlane(GLenum plane,Const GLdouble *equation)函数,应该如何确定*equation?急。
      

  3.   

    垂直于Y轴且经过点P的平面为载翦面
    很简单!
    因为y轴的向量是(0,1,0),所以法向量就是(0,1,0)
    设p点(a,b,c).则平面方程0*(x-a)+1*(y-b)+0*(z-c)=0
    即y = b;
      

  4.   

    y轴的方向就是y方向么,当然是(0,1,0)了,没有什么不好理解的啊?
    至于法向量,你看看下面的代码,有没有帮助,也就是象 竹山 说的叉乘了,其他的我也不是很清楚。
    GetNormal(GLfloat p0[3],GLfloat p1[3],GLfloat p2[3],GLfloat *ddnv)
    //  p0,p1,p2 are three points in a triangle.

       GLfloat wx,wy,wz,vx,vy,vz,nr,nx,ny,nz;   wx=p0[0]-p1[0]; wy=p0[1]-p1[1]; wz=p0[2]-p1[2];
       vx=p2[0]-p1[0]; vy=p2[1]-p1[1]; vz=p2[2]-p1[2];
       nx=wz*vy-wy*vz;
       ny=wx*vz-wz*vx;
       nz=wy*vx-wx*vy;
       nr=(float)sqrt(nx*nx+ny*ny+nz*nz);   ddnv[0]=nx/nr;  ddnv[1]=ny/nr;  ddnv[2]=nz/nr; 
    }
      

  5.   

    因为y轴的向量是(0,1,0),所以法向量就是(0,1,0)
    设p点(a,b,c).则平面方程0*(x-a)+1*(y-b)+0*(z-c)=0
    即y = b;
    y=b,那x,z是可取任意数吗?还有一个参数取什么呢?
      

  6.   

    y=b,这本来就是一个平面方程嘛,一个平面上有无穷多个点,x,z是任意数也未尝不可啊,只要符合y=b这个约束条件就可以了嘛。
    怎么感觉越来越象在讲高等数学了?????
      

  7.   

    GetNormal(GLfloat p0[3],GLfloat p1[3],GLfloat p2[3],GLfloat *ddnv)看看我以下做的对不对:给出三个点P1(0,2,0),P2(2,0,0),P3(2,0,2),把三个点代入上面的GetNormal,得出法向量:(0.7,0.0,0.7),然后取P1(0,2,0)点,得平面方程:0.7*(x-0)+0*(y-2)+0.7*(z-0)=0化简得:0.7*X+0.7*Z=0即A、B、C、D四个数分别为(0.7,0,0.7,0); 如果取点P2或者点P3,计算出来的结果各不相同,分别是(0.7,0,0.7,-1.4)和(0.7,0,0.7,-2.8)
    其中(0.7,0,0.7,-2.8)在屏幕上没有显示出来,
      

  8.   

    我也晕了,不过第一、法向量明显没有归一化,不是单位法向量。
    第二、GetNormal中的三角形顶点是有序的,好像是逆时针吧,我不知道你注意这一点没有,你自己再看看。
    再去问问 竹山 ,我觉得他比我清楚
      

  9.   

    法向量不进行单位化,问题不是太大(就这里而言)
    你根据p1,p2,p3点求出的法向量是错的。因为(p1-p2)与(p2-p3)的差乘不是(0.7,0,0.7)
    而是(1,1,0)。
    所以平面方程应该是x-2+y=0。
    你可以再试试
      

  10.   

    请问竹山前辈:是不是把p1,p2,p3三个点作为上面的GetNormal(GLfloat p0[3],GLfloat p1[3],GLfloat p2[3],GLfloat *ddnv)的参数啊?但是我计算出来的差乘是(0.7,0.7,0),你们所说的单位化是不是把小数的法向量变为整数啊?是不是就是把以上我计算出来的结果(0.7,0.7,0)四舍五入啊????????
      

  11.   

    不是酱紫的,你念书的时候肯定不是好学生哦,怎么什么都不清楚呢?
    单位化就是ddnv[0]=nx/nr;  ddnv[1]=ny/nr;  ddnv[2]=nz/nr;嘛,
    nr=(float)sqrt(nx*nx+ny*ny+nz*nz);就是每一项都除以他们的平方和嘛,不过这个就像竹山讲的 这个地方是不是单位化不是很重要。
    而且我也说了p1,p2,p3是有序的,不是你随便想对应哪个点都行的,顺序不对的话算出来的法向量自然不对的。
    真的,你的问题不在程序上面啊。
      

  12.   

    P1(0,2,0),P2(2,0,0),P3(2,0,2)已经是按逆时针顺序排列的了,p1在y正半轴, p2在x正轴,p3在屏幕里面,即然程序没有问题,但是为什么套进去不行呢?难道我把逆时针这个概念搞错了?真搞不明白。
      

  13.   

    不对啊,P3(2,0,2)的Z坐标值大于0,明明是在屏幕外面啊,openGL的坐标系搞清楚啊
      

  14.   

    不好意思,我搞错了,但是我改为P1,p3,p2作为GetNormal(GLfloat p0[3],GLfloat p1[3],GLfloat p2[3],GLfloat *ddnv)的参数,还是不行。结果是(0.707107,0.707107,0)上面的公式GetNormal()应该没有错吧?
      

  15.   

    同意 kyanitelj(嫣然) !
    学好高数吧!
    我要考试了,没时间给你解释。
    书才是最好的老师,因为你看懂了的话,就能保留一辈子。
    ok!
      

  16.   

    哇, alphapaopao(炮炮) 都到两颗星了
    厉害!!!
      

  17.   

    原来是这样子,我终于明白了,谢谢 wqs6(竹山) 兄和kyanitelj(嫣然)兄,这几天都给你们添麻烦了,真不好意思。