- 积分
- 44
- 帖子
- 24
- 主题
- 5
- 精华
- 0
- 最后登录
- 2011-1-5
- 在线时间
- 6 小时
- 私信
|
发表时间 : 2011-1-5 16:09:56
|
浏览 : 1726 评论 : 0
这一课是产生影子,其中有个函数是判断同边(或者说是判断三角形相邻的)的,我根据教程中的伪代码把源码中的程序作了如下修改后就不能显示影子了请问是为什么?
inline void SetConnectivity(glObject *o){
unsigned int p1i, p2i, p1j, p2j;
unsigned int P1i, P2i, P1j, P2j;
unsigned int i,j,ki,kj;
for(i=0;i<o->nPlanes-1;i++) //对于每个面A
for(j=i+1;j<o->nPlanes;j++) //对于除了每个面A的每个面B
for(ki=0;ki<3;ki++) //对于面A的每个顶点
if(!o->planes.neigh[ki]){ //对于如果面A的顶点没有相邻设置
for(kj=0;kj<3;kj++){ //对于面B的每个顶点
p1i=ki;
p1j=kj;
p2i=(ki+1)%3; //得下一个点组成线(0,1);(1,2);(2,0)
p2j=(kj+1)%3;
p1i=o->planes.p[p1i]; //得到顶点的索引
p2i=o->planes.p[p2i];
p1j=o->planes[j].p[p1j];
p2j=o->planes[j].p[p2j];
//下面被注释的五句是源代码
/*P1i=((p1i+p2i)-abs(p1i-p2i))/2;
P2i=((p1i+p2i)+abs(p1i-p2i))/2;
P1j=((p1j+p2j)-abs(p1j-p2j))/2;
P2j=((p1j+p2j)+abs(p1j-p2j))/2;
if((P1i==P1j)) && (P2i==P2j)) */
//下面这句是我根据伪代码改的
if (((p1i=p1j) && (p2i=p2j)) || ((p1i=p2j) && (p2i=p1j)))
{ //they are neighbours
o->planes.neigh[ki] = j+1;
o->planes[j].neigh[kj] = i+1;
}
}
}
}
inline void CalcPlane(glObject o, sPlane *plane){
sPoint v[4];
int i;
for (i=0;i<3;i++){
v[i+1].x = o.points[plane->p].x;
v[i+1].y = o.points[plane->p].y;
v[i+1].z = o.points[plane->p].z;
}
plane->PlaneEq.a = v[1].y*(v[2].z-v[3].z) + v[2].y*(v[3].z-v[1].z) + v[3].y*(v[1].z-v[2].z);
plane->PlaneEq.b = v[1].z*(v[2].x-v[3].x) + v[2].z*(v[3].x-v[1].x) + v[3].z*(v[1].x-v[2].x);
plane->PlaneEq.c = v[1].x*(v[2].y-v[3].y) + v[2].x*(v[3].y-v[1].y) + v[3].x*(v[1].y-v[2].y);
plane->PlaneEq.d =-( v[1].x*(v[2].y*v[3].z - v[3].y*v[2].z) +
v[2].x*(v[3].y*v[1].z - v[1].y*v[3].z) +
v[3].x*(v[1].y*v[2].z - v[2].y*v[1].z) );
}
另外还有一个问题就是他用给出的三个点得出平面议程的Ax+By+Cz+D=0,四个未知数三个方程怎么解的啊? |
|