prem@geomag.fsu.edu (Prem Subrahmanyam) (03/06/90)
Here is the code I wrote in C for doing 3-dimensional quadratics. the derivations are rather complex, so I tried to comment the code as best I could, but that's all I could do. I hope people find this interesting. ---Prem Subrahmanyam (prem@geomag.gly.fsu.edu) #define TINY (float)1e-3 int hitconic(offset,eye,v,p,t,a,b,c,d,e,f,g,start,stop) /* offset is the triple representing where the conic is to be moved */ /* from 0,0,0. */ /* eye and v represent the ray, with eye being the start point and v */ /* being the direction vector */ /* p is the point into which the intersection point value will be */ /* copied */ /* t is the value into which the line parameter will be copied for the */ /* ray. */ /* a,b,c,d,e,f,g are values for the 3-dimensional quadratic equation */ /* a*x^2 + b*y^2 + c*z^2 + d*x + e*y + f*z = g */ /* start and stop represent the bounds (when the equation is centered at 0,0,0) in which to test the conic */ /* example: if the bound around a conic were set at -1,-1,-1 to 1,1,1 and the offset was 4,5,6 then the actual spatial extent of the object would be from 3,4,5 to 5,6,7 . */ /* So, the conic (3-d quadratic) should contain within its own data structure the offset, extent values (start,stop), and a,b,c,d,e,f,g constants */ vector offset, eye, v, p; float *t, a, b, c, d, e, f, g; vector start, stop; { /*************************************************/ /* this code is a little messy, but it does work */ /*************************************************/ /* create some local points to use in testing */ vector m,p2; float radical,Ay,Be,Ce,t1,t2; /* constants for quadratic formula */ /* generated for solving for the intersection of the equations for the line and the equation for the quadratic */ /* subtract offset from the ray start position to align ray and quadratic*/ m[0] = eye[0] - offset[0]; m[1] = eye[1] - offset[1]; m[2] = eye[2] - offset[2]; /* Now, using the constant values, create values for the intersection test formula */ Ay = (a*v[0]*v[0]) + (b*v[1]*v[1]) + (c*v[2]*v[2]); Be = (2*a*m[0]*v[0]) + (2*b*m[1]*v[1]) + (2*c*m[2]*v[2]) + (d*v[0]) + (e*v[1]) + (f*v[2]); Ce = (a*m[0]*m[0]) + (b*m[1]*m[1]) + (c*m[2]*m[2]) + (d*m[0]) + (e*m[1]) + (f*m[2]) - g; radical = ((Be*Be) - (4*Ay*Ce)); if (radical < 0.0) { return FALSE; } t1 = ((-1*Be) + sqrt(radical))/(2*Ay); t2 = ((-1*Be) - sqrt(radical))/(2*Ay); /* immediately eliminate cases in which return is false */ if (((t1 < 0)&&(t2 < 0))||((t1 < 0)&&(fabs(t2) < TINY))||((t2 < 0)&&(fabs(t1) < TINY))||((fabs(t1) < TINY)&&(fabs(t2) < TINY))) { return FALSE; }else{ /* t1 a bad parameter, but t2 may not be */ if ((t1 < 0)||(fabs(t1) < TINY)) { if (!(fabs(t2) < TINY)) /* prevent spurious self-shadowing */ { /* using the parameter, find the point of intersection */ p[0] = m[0] + v[0]*t2; p[1] = m[1] + v[1]*t2; p[2] = m[2] + v[2]*t2; /* test to see if the point is within the bounds for the quadratic section */ if ((start[0] <= p[0])&&(stop[0] >= p[0])&&(start[1] <= p[1])&&(stop[1] >= p[1])&&(start[2] <= p[2])&&(stop[2] >= p[2])) { /* if it lies within the bounds, add offset back on and return point */ p[0] = p[0] + offset[0]; p[1] = p[1] + offset[1]; p[2] = p[2] + offset[2]; *t = t2; return TRUE; } else { /* point does not lie within the bounds */ return FALSE; } }else{ /* t2 a bad parameter as well */ return FALSE; } } if ((t2 < 0)||(fabs(t2) < TINY)) { /* t2 a false parameter, so test to see if t1 is good */ if(!(fabs(t1) < TINY)) { /* find point by parameter */ p[0] = m[0] + v[0]*t1; p[1] = m[1] + v[1]*t1; p[2] = m[2] + v[2]*t1; if ((start[0] <= p[0])&&(stop[0] >= p[0])&&(start[1] <= p[1])&&(stop[1] >= p[1])&&(start[2] <= p[2])&&(stop[2] >=p[2])) { /* same as above, see if point lies within bounds */ p[0] = p[0] + offset[0]; p[1] = p[1] + offset[1]; p[2] = p[2] + offset[2]; *t = t1; return TRUE; } else { return FALSE; } }else{ return FALSE; } } /* if the program has gotten here, t1 and t2 are greater than 0 */ /* and greater than TINY */ p[0] = m[0] + v[0]*t1; p[1] = m[1] + v[1]*t1; p[2] = m[2] + v[2]*t1; p2[0] = m[0] + v[0]*t2; p2[1] = m[1] + v[1]*t2; p2[2] = m[2] + v[2]*t2; /* see if the first point is within bounds */ if ((start[0] <= p[0])&&(stop[0] >= p[0])&&(start[1] <= p[1])&&(stop[1] >= p[1])&&(start[2] <= p[2])&&(stop[2] >=p[2])) { /* now, see if second point is as well */ if ((start[0] <= p2[0])&&(stop[0] >= p2[0])&&(start[1] <= p2[1])&&(stop[1] >= p2[1])&&(start[2] <= p2[2])&&(stop[2] >=p2[2])) { /* both points are within bbox */ if (t1 <= t2) /*see which one is smaller */ { /* t1 yields a closer point */ *t = t1; p[0] = p[0] + offset[0]; p[1] = p[1] + offset[1]; p[2] = p[2] + offset[2]; return TRUE; } else { /* t2 yields a closer point */ *t = t2; p[0] = p2[0] + offset[0]; p[1] = p2[1] + offset[1]; p[2] = p2[2] + offset[2]; return TRUE; } } else { /* second point not within box */ *t = t1; p[0] = p[0] + offset[0]; p[1] = p[1] + offset[1]; p[2] = p[2] + offset[2]; return TRUE; } } else { /* t1 not within bbox */ if ((start[0] <= p2[0])&&(stop[0] >= p2[0])&&(start[1] <= p2[1])&&(stop[1] >= p2[1])&&(start[2] <= p2[2])&&(stop[2] >=p2[2])) { /* see if t2 is within bbox */ *t = t2; p[0] = p2[0] + offset[0]; p[1] = p2[1] + offset[1]; p[2] = p2[2] + offset[2]; return TRUE; } else { /* neither is within bounding box */ return FALSE; } } } } /* HERE IS THE PORTION OF THE CODE THAT RETURNS THE NORMAL TO THE QUADRATIC */ void findnormal(np,p,n) node *np; vector p, n; /* np is the pointer to the object node, p is the point of intersection, and n is the normal vector returned */ { vector point; switch (np->kind) { /* conic section a la Prem */ case CONIC : point[0] = p[0] - cptr(np)->offset[0]; point[1] = p[1] - cptr(np)->offset[1]; point[2] = p[2] - cptr(np)->offset[2]; n[0] = 2.0*cptr(np)->a*point[0] + cptr(np)->d; n[1] = 2.0*cptr(np)->b*point[1] + cptr(np)->e; n[2] = 2.0*cptr(np)->c*point[2] + cptr(np)->f; normalize(n); break; }
Susan.King@f270.n106.z1.fidonet.org (Susan King) (03/12/90)
> > From: tom@hp-ptp.HP.COM (Tom_Balon) > Date: 2 Mar 90 23:04:26 GMT > Organization: HP Pacific Technology Park - Sunnyvale, Ca. > Message-ID: <1580005@hp-ptp.HP.COM> > Newsgroups: comp.graphics > > > > > I looking for information on computer animation. I know > there > are a few companies in the Bay Area that are involved > with > animation ( Pixar, Industrial Light and Magic ). What > I'm looking > for is any information on software packages for creating > animated > sequences. I'm also looking for any good books on graphics/animation. > > I'm interested in software for DOS (386) machines, HP > or Apollo > workstations. Also, if anyone knows any names of other > companies > in the bay area involved with computer animation, that > would be > helpful too. Any help would be appreciated. > > > tom > > tom@hpdsla.HP.COM Tom, we have been successfully doing some animation sequences which we have outputed on both disk and video. We are using a program called GRASP that works very nicely on a 386 machine. We have used screen captures from CAD to bring in the basic drawings.. rendered them in a paint program like Colorix or PC Paintbrush Plus... and then used GRASP to animate... The results have been great!
bdb@becker.UUCP (Bruce Becker) (03/16/90)
In article <1580005@hp-ptp.HP.COM> tom@hp-ptp.HP.COM (Tom_Balon) writes: | | I looking for information on computer animation. I know there | are a few companies in the Bay Area that are involved with | animation ( Pixar, Industrial Light and Magic ). What I'm looking | for is any information on software packages for creating animated | sequences. I'm also looking for any good books on graphics/animation. | I'm interested in software for DOS (386) machines, HP or Apollo | workstations. Also, if anyone knows any names of other companies | in the bay area involved with computer animation, that would be | helpful too. Any help would be appreciated. I think you're missing a good bet if you're not checking out what's available on Amiga systems. There's a very wide range of powerful animation software and ancillary support tools on this system. A local dealer can give you details... -- (__) Bruce Becker Toronto, Ontario w \@@/ Internet: bdb@becker.UUCP, bruce@gpu.utcs.toronto.edu `/v/-e UUCP: ...!uunet!mnetor!becker!bdb _/ \_ "So far from God, so close to the United States" - Old Mexican proverb