Draw a cube with culling.
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
9e324be3e2
commit
a4e7731412
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user