62 lines
1.5 KiB
Plaintext
62 lines
1.5 KiB
Plaintext
// 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;
|
|
}
|
|
}
|