在OpenGL里的附加平面裁剪函数void glClipPlane(GLenum plane,Const GLdouble *equation);其中参数equation指向一个拥有四个系数值的数组,这四个系数分别是裁剪平面Ax+By+Cz+D=0的A、B、C、D值,即系A,B,C,D系如何确定一个裁剪面啊?
解决方案 »
- 寻找四个函数
- 三年了 ~她就这样说分手 我不甘心~~
- 如何获得进程所对应的用户
- 如何判断当前打开的对话框是模态还是非模态的?
- 各位大哥哥,帮帮小妹吧~~~
- 想把一个多文档文件改为 单文档的文件,请问可行吗?
- 请教,我想测试一个服务器的吞吐量(http)
- 为何我的问题总是没人回答?
- 对modem操作的串口的DCB参数怎么设置??根据什么设置?DCB各参数意义各位谁清楚?高分
- 如何使用RegCreateKeyEx函数?
- 聊聊的ActiveX语音控件用的是什么语音压缩算法?效率那么高!是MS ACM(msg723.1)?谁能告诉我?给500分!
- 新建一个Dialog,上面放一个CTabCtrl,在其他类如CMainFrame中,dlg.DoModal()调用,想直接切换显示到第3页,怎么做?
先A-B,B-C
然后(A-B)与(B-C)做叉乘。得到平面的法矢量
接着在A,B,C中任取一点,带入法矢量就可以得到平面方程。
P(x,y,z),以垂直于Y轴且经过点P的平面为载翦面,用glClipPlane(GLenum plane,Const GLdouble *equation)函数,应该如何确定*equation?急。
很简单!
因为y轴的向量是(0,1,0),所以法向量就是(0,1,0)
设p点(a,b,c).则平面方程0*(x-a)+1*(y-b)+0*(z-c)=0
即y = b;
至于法向量,你看看下面的代码,有没有帮助,也就是象 竹山 说的叉乘了,其他的我也不是很清楚。
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;
}
设p点(a,b,c).则平面方程0*(x-a)+1*(y-b)+0*(z-c)=0
即y = b;
y=b,那x,z是可取任意数吗?还有一个参数取什么呢?
怎么感觉越来越象在讲高等数学了?????
其中(0.7,0,0.7,-2.8)在屏幕上没有显示出来,
第二、GetNormal中的三角形顶点是有序的,好像是逆时针吧,我不知道你注意这一点没有,你自己再看看。
再去问问 竹山 ,我觉得他比我清楚
你根据p1,p2,p3点求出的法向量是错的。因为(p1-p2)与(p2-p3)的差乘不是(0.7,0,0.7)
而是(1,1,0)。
所以平面方程应该是x-2+y=0。
你可以再试试
单位化就是ddnv[0]=nx/nr; ddnv[1]=ny/nr; ddnv[2]=nz/nr;嘛,
nr=(float)sqrt(nx*nx+ny*ny+nz*nz);就是每一项都除以他们的平方和嘛,不过这个就像竹山讲的 这个地方是不是单位化不是很重要。
而且我也说了p1,p2,p3是有序的,不是你随便想对应哪个点都行的,顺序不对的话算出来的法向量自然不对的。
真的,你的问题不在程序上面啊。
学好高数吧!
我要考试了,没时间给你解释。
书才是最好的老师,因为你看懂了的话,就能保留一辈子。
ok!
厉害!!!