12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // Triangle
- class Triangle {
- // position
- PVector p1, p2, p3;
- // color
- color c1, c2, c3;
- BoundingBox bbx;
- Triangle(PVector p1, PVector p2, PVector p3, color c1, color c2, color c3) {
- this.p1 = p1;
- this.p2 = p2;
- this.p3 = p3;
- this.c1 = c1;
- this.c2 = c2;
- this.c3 = c3;
- bbx = new BoundingBox();
- bbx.create(this);
- }
- // check to see if a ray intersects with the triangle
- boolean intersect(Ray r, float[] param) {
- PVector p21 = PVector.sub(p2, p1);
- PVector p31 = PVector.sub(p3, p1);
- PVector po1 = PVector.sub(r.ori, p1);
- PVector dxp31 = r.dir.cross(p31);
- PVector po1xp21 = po1.cross(p21);
- float denom = p21.dot(dxp31);
- float t = p31.dot(po1xp21) / denom;
- float alpha = po1.dot(dxp31) / denom;
- float beta = r.dir.dot(po1xp21) / denom;
- boolean res = t > 0 && alpha > 0 && alpha < 1 && beta > 0 && beta < 1 &&
- alpha + beta < 1;
- // depth test
- if (res && t < param[0]) {
- param[0] = t;
- param[1] = alpha * p1.x + beta * p2.x + (1 - alpha - beta) * p3.x;
- param[2] = alpha * p1.y + beta * p2.y + (1 - alpha - beta) * p3.y;
- param[3] = alpha * p1.z + beta * p2.z + (1 - alpha - beta) * p3.z;
- }
- return res;
- }
- void render() {
- beginShape(TRIANGLES);
- fill(c1);
- vertex(p1.x, p1.y, p1.z);
- fill(c2);
- vertex(p2.x, p2.y, p2.z);
- fill(c3);
- vertex(p3.x, p3.y, p3.z);
- endShape();
- }
- }
- // Ray
- class Ray {
- // origin and direction
- PVector ori, dir;
- Ray(PVector ori, PVector dir) {
- this.ori = ori;
- this.dir = dir;
- }
- }
|