Draw a cube with culling.
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
9e324be3e2
commit
a4e7731412
@ -112,6 +112,24 @@ 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;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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.A, triProjected.A, SigRenderer.matProj);
|
||||||
Matrix.MultiplyMatrixVector(triTranslated.B, triProjected.B, SigRenderer.matProj);
|
Matrix.MultiplyMatrixVector(triTranslated.B, triProjected.B, SigRenderer.matProj);
|
||||||
Matrix.MultiplyMatrixVector(triTranslated.C, triProjected.C, SigRenderer.matProj);
|
Matrix.MultiplyMatrixVector(triTranslated.C, triProjected.C, SigRenderer.matProj);
|
||||||
@ -131,6 +149,7 @@ public class Panel extends JPanel implements Runnable {
|
|||||||
|
|
||||||
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);
|
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;
|
||||||
endTime=System.nanoTime();
|
endTime=System.nanoTime();
|
||||||
|
@ -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…
x
Reference in New Issue
Block a user