Draw a cube with culling.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
sigonasr2, Sig, Sigo 2021-11-02 13:33:53 +00:00
parent 9e324be3e2
commit a4e7731412
3 changed files with 45 additions and 79 deletions

View File

@ -112,24 +112,43 @@ public class Panel extends JPanel implements Runnable {
triTranslated.B.z=triRotatedZX.B.z+3f;
triTranslated.C.z=triRotatedZX.C.z+3f;
Matrix.MultiplyMatrixVector(triTranslated.A, triProjected.A, SigRenderer.matProj);
Matrix.MultiplyMatrixVector(triTranslated.B, triProjected.B, SigRenderer.matProj);
Matrix.MultiplyMatrixVector(triTranslated.C, triProjected.C, SigRenderer.matProj);
Vector3f normal=new Vector3f(),line1=new Vector3f(),line2=new Vector3f();
line1.x=triTranslated.B.x-triTranslated.A.x;
line1.y=triTranslated.B.y-triTranslated.A.y;
line1.z=triTranslated.B.z-triTranslated.A.z;
line2.x=triTranslated.C.x-triTranslated.A.x;
line2.y=triTranslated.C.y-triTranslated.A.y;
line2.z=triTranslated.C.z-triTranslated.A.z;
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;
normal.x=line1.y*line2.z-line1.z*line2.y;
normal.y=line1.z*line2.x-line1.x*line2.z;
normal.z=line1.x*line2.y-line1.y*line2.x;
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);
float l = (float)Math.sqrt(normal.x*normal.x+normal.y*normal.y+normal.z*normal.z);
normal.x/=l; normal.y/=l; normal.z/=l;
if (normal.x*(triTranslated.A.x-SigRenderer.vCamera.x)+
normal.y*(triTranslated.A.y-SigRenderer.vCamera.y)+
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;
j += 1;

View File

@ -44,6 +44,8 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene
{0,0,(-fFar*fNear)/(fFar-fNear),0f},
});
public static Vector3f vCamera = new Vector3f();
public void runGameLoop() {
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(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(0,1,0),new Vector3f(0,1,1),new Vector3f(1,1,0)),
new Triangle(new Vector3f(0,1,1),new Vector3f(1,1,1),new Vector3f(1,1,0)),
new Triangle(new Vector3f(),new Vector3f(0,0,1),new Vector3f(1,0,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,1),new Vector3f(1,0,1)),
new Triangle(new Vector3f(0,1,1),new Vector3f(1,1,1),new Vector3f(1,0,1)),
new Triangle(new Vector3f(),new Vector3f(0,1,0),new Vector3f(0,0,1)),
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(1,1,1),new Vector3f(0,1,1)),
new Triangle(new Vector3f(1,0,1),new Vector3f(0,1,1),new Vector3f(0,0,1)),
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(0,1,0),new Vector3f(0,0,0)),
new Triangle(new Vector3f(0,1,0),new Vector3f(0,1,1),new Vector3f(1,1,1)),
new Triangle(new Vector3f(0,1,0),new Vector3f(1,1,1),new Vector3f(1,1,0)),
new Triangle(new Vector3f(1,0,1),new Vector3f(0,0,1),new Vector3f(0,0,0)),
new Triangle(new Vector3f(1,0,1),new Vector3f(0,0,0),new Vector3f(1,0,0)),
}));
Panel p = new Panel();

View File

@ -16,59 +16,4 @@ public class Triangle {
public String toString() {
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;
}
}