Draw a cube with culling.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
origin
sigonasr2, Sig, Sigo 3 years ago
parent 9e324be3e2
commit a4e7731412
  1. 55
      src/sig/Panel.java
  2. 18
      src/sig/SigRenderer.java
  3. 55
      src/sig/Triangle.java

@ -112,24 +112,43 @@ public class Panel extends JPanel implements Runnable {
triTranslated.B.z=triRotatedZX.B.z+3f; triTranslated.B.z=triRotatedZX.B.z+3f;
triTranslated.C.z=triRotatedZX.C.z+3f; triTranslated.C.z=triRotatedZX.C.z+3f;
Matrix.MultiplyMatrixVector(triTranslated.A, triProjected.A, SigRenderer.matProj); Vector3f normal=new Vector3f(),line1=new Vector3f(),line2=new Vector3f();
Matrix.MultiplyMatrixVector(triTranslated.B, triProjected.B, SigRenderer.matProj); line1.x=triTranslated.B.x-triTranslated.A.x;
Matrix.MultiplyMatrixVector(triTranslated.C, triProjected.C, SigRenderer.matProj); line1.y=triTranslated.B.y-triTranslated.A.y;
line1.z=triTranslated.B.z-triTranslated.A.z;
triProjected.A.x+=1f; line2.x=triTranslated.C.x-triTranslated.A.x;
triProjected.A.y+=1f; line2.y=triTranslated.C.y-triTranslated.A.y;
triProjected.B.x+=1f; line2.z=triTranslated.C.z-triTranslated.A.z;
triProjected.B.y+=1f;
triProjected.C.x+=1f; normal.x=line1.y*line2.z-line1.z*line2.y;
triProjected.C.y+=1f; normal.y=line1.z*line2.x-line1.x*line2.z;
triProjected.A.x*=0.5f*SigRenderer.SCREEN_WIDTH; normal.z=line1.x*line2.y-line1.y*line2.x;
triProjected.A.y*=0.5f*SigRenderer.SCREEN_HEIGHT;
triProjected.B.x*=0.5f*SigRenderer.SCREEN_WIDTH; float l = (float)Math.sqrt(normal.x*normal.x+normal.y*normal.y+normal.z*normal.z);
triProjected.B.y*=0.5f*SigRenderer.SCREEN_HEIGHT; normal.x/=l; normal.y/=l; normal.z/=l;
triProjected.C.x*=0.5f*SigRenderer.SCREEN_WIDTH;
triProjected.C.y*=0.5f*SigRenderer.SCREEN_HEIGHT; if (normal.x*(triTranslated.A.x-SigRenderer.vCamera.x)+
normal.y*(triTranslated.A.y-SigRenderer.vCamera.y)+
DrawUtils.DrawTriangle(p,(int)triProjected.A.x,(int)triProjected.A.y,(int)triProjected.B.x,(int)triProjected.B.y,(int)triProjected.C.x,(int)triProjected.C.y,Color.BLACK); normal.z*(triTranslated.A.z-SigRenderer.vCamera.z)<0) {
Matrix.MultiplyMatrixVector(triTranslated.A, triProjected.A, SigRenderer.matProj);
Matrix.MultiplyMatrixVector(triTranslated.B, triProjected.B, SigRenderer.matProj);
Matrix.MultiplyMatrixVector(triTranslated.C, triProjected.C, SigRenderer.matProj);
triProjected.A.x+=1f;
triProjected.A.y+=1f;
triProjected.B.x+=1f;
triProjected.B.y+=1f;
triProjected.C.x+=1f;
triProjected.C.y+=1f;
triProjected.A.x*=0.5f*SigRenderer.SCREEN_WIDTH;
triProjected.A.y*=0.5f*SigRenderer.SCREEN_HEIGHT;
triProjected.B.x*=0.5f*SigRenderer.SCREEN_WIDTH;
triProjected.B.y*=0.5f*SigRenderer.SCREEN_HEIGHT;
triProjected.C.x*=0.5f*SigRenderer.SCREEN_WIDTH;
triProjected.C.y*=0.5f*SigRenderer.SCREEN_HEIGHT;
DrawUtils.DrawTriangle(p,(int)triProjected.A.x,(int)triProjected.A.y,(int)triProjected.B.x,(int)triProjected.B.y,(int)triProjected.C.x,(int)triProjected.C.y,Color.BLACK);
}
} }
i += 1; i += 1;
j += 1; j += 1;

@ -44,6 +44,8 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
{0,0,(-fFar*fNear)/(fFar-fNear),0f}, {0,0,(-fFar*fNear)/(fFar-fNear),0f},
}); });
public static Vector3f vCamera = new Vector3f();
public void runGameLoop() { public void runGameLoop() {
rot+=Math.PI/480d; rot+=Math.PI/480d;
} }
@ -55,14 +57,14 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
new Triangle(new Vector3f(),new Vector3f(1,1,0),new Vector3f(1,0,0)), new Triangle(new Vector3f(),new Vector3f(1,1,0),new Vector3f(1,0,0)),
new Triangle(new Vector3f(1,0,0),new Vector3f(1,1,0),new Vector3f(1,1,1)), new Triangle(new Vector3f(1,0,0),new Vector3f(1,1,0),new Vector3f(1,1,1)),
new Triangle(new Vector3f(1,0,0),new Vector3f(1,1,1),new Vector3f(1,0,1)), new Triangle(new Vector3f(1,0,0),new Vector3f(1,1,1),new Vector3f(1,0,1)),
new Triangle(new Vector3f(0,1,0),new Vector3f(0,1,1),new Vector3f(1,1,0)), new Triangle(new Vector3f(1,0,1),new Vector3f(1,1,1),new Vector3f(0,1,1)),
new Triangle(new Vector3f(0,1,1),new Vector3f(1,1,1),new Vector3f(1,1,0)), new Triangle(new Vector3f(1,0,1),new Vector3f(0,1,1),new Vector3f(0,0,1)),
new Triangle(new Vector3f(),new Vector3f(0,0,1),new Vector3f(1,0,0)), new Triangle(new Vector3f(0,0,1),new Vector3f(0,1,1),new Vector3f(0,1,0)),
new Triangle(new Vector3f(0,0,1),new Vector3f(1,0,1),new Vector3f(1,0,0)), new Triangle(new Vector3f(0,0,1),new Vector3f(0,1,0),new Vector3f(0,0,0)),
new Triangle(new Vector3f(0,0,1),new Vector3f(0,1,1),new Vector3f(1,0,1)), new Triangle(new Vector3f(0,1,0),new Vector3f(0,1,1),new Vector3f(1,1,1)),
new Triangle(new Vector3f(0,1,1),new Vector3f(1,1,1),new Vector3f(1,0,1)), new Triangle(new Vector3f(0,1,0),new Vector3f(1,1,1),new Vector3f(1,1,0)),
new Triangle(new Vector3f(),new Vector3f(0,1,0),new Vector3f(0,0,1)), new Triangle(new Vector3f(1,0,1),new Vector3f(0,0,1),new Vector3f(0,0,0)),
new Triangle(new Vector3f(0,1,0),new Vector3f(0,1,1),new Vector3f(0,0,1)), new Triangle(new Vector3f(1,0,1),new Vector3f(0,0,0),new Vector3f(1,0,0)),
})); }));
Panel p = new Panel(); Panel p = new Panel();

@ -16,59 +16,4 @@ public class Triangle {
public String toString() { public String toString() {
return "Triangle [A=" + A + ", B=" + B + ", C=" + C + "]"; return "Triangle [A=" + A + ", B=" + B + ", C=" + C + "]";
} }
public Vector3f getNormal() {
Vector3f AB = (Vector3f)A.clone();
AB.sub(B);
Vector3f BC = (Vector3f)B.clone();
BC.sub(C);
Vector3f crossP = new Vector3f();
crossP.cross(AB,BC);
//crossP.normalize();
return crossP;
}
public float distanceFromOrigin() {
return getNormal().dot(A);
}
public boolean rayTriangleIntersect(Vector3f origin,Vector3f dir) {
Vector3f N = getNormal();
float NrayDir = N.dot(dir);
if (NrayDir<=0.001) { //Very small, so it's parallel.
return false;
}
float d = distanceFromOrigin();
float T=(getNormal().dot(origin)+d)/(NrayDir);
if (T<0) {return false;} //Triangle is behind the ray.
//System.out.println("Not behind.");
Vector3f scaleMult = (Vector3f)dir.clone();
scaleMult.scale(T);
Vector3f P = (Vector3f)origin.clone();
P.add(scaleMult);
Vector3f C;
Vector3f edge0 = (Vector3f)B.clone(); edge0.sub(A);
Vector3f vp0 = (Vector3f)P.clone(); vp0.sub(A);
C = new Vector3f(); C.cross(edge0,vp0);
if (N.dot(C)<0) {return false;}
Vector3f edge1 = (Vector3f)this.C.clone(); edge1.sub(B);
Vector3f vp1 = (Vector3f)P.clone(); vp1.sub(B);
C = new Vector3f(); C.cross(edge1,vp1);
if (N.dot(C)<0) {return false;}
Vector3f edge2 = (Vector3f)A.clone(); edge2.sub(this.C);
Vector3f vp2 = (Vector3f)P.clone(); vp2.sub(this.C);
C = new Vector3f(); C.cross(edge2,vp2);
if (N.dot(C)<0) {return false;}
return true;
}
} }

Loading…
Cancel
Save