Z-Clipping

The main purpose of z-clipping is to prevent a triangle from trashing memory and drawing out of the screenspace.

Okay, now let's get busy.

First I'll explain what the intersection is: The intersection is the point where the line crosses the plane:

A \ \ C -------\-------- it's the z-plane \ B

Now the intersected point is C. So you draw a new line AC instead of AB.

How do we calculate the intersected point? Well, easy: There is a parametric line formula:

intersected_x = x1 + t * ( x2 - x1 ); intersected_y = y1 + t * ( y2 - y1 ); intersected_z = z1 + t * ( z2 - z1 );

You probably ask yourself: "How the fuck do I calculate the t or maybe not?" The answer is simple:

z_min = z1 + t * ( z2 - z1 ); z_min - z1 = t * ( z2 - z1 ); t = (z_near - z1 ) / ( z2 - z1 ); z_near and z_min are eqaul

Think of your triangle as three lines. Just make a procedure for finding the intersected points.

point3d TMP; int z_min=15; // try different values void clip( point3d *src , point3d *dst ) { float t = (float)( z_min - dst->z ) / (float) ( src->z - dst->z ); TMP.x = dst->x + t * ( src->x - dst->x ) ; TMP.y = dst->y + t * ( src->y - dst->y ) ; TMP.z = dst->z + t * ( src->z - dst->z ) ; TMP.u = dst->y + t * ( src->u - dst->y ) ; TMP.v = dst->v + t * ( src->v - dst->v ) ; }

How we do it is simple. But first watch this:

Y /|\ | |3 |2 |1 ---------|--------->X |-1 |-2 |-3 |-4

So you see: All the axes here are reversed. Unlike in computer, the bigger the Y-axis is, the more below it is.

Just sort your triangle lines by their Z-values as:

A - Top

B - Middle

C - Bottom

If you don't know how to sort, then contact me. ;)

Okay, now let's get to the main part. First we should check if all the triangle is behind the z_min:

So

if ( A.z < z_min ) and ( B.z < z_min ) and ( C.z < z_min ) continue;

because all the triangle is behind the plane and it's invisible.

if ( A.z < z_min ) continue ; // its invisible if ( C.z > z_min ) { put your triangle on the screen, it's fully visible triangle(A,B,C); continue; } if ( B.z < Z_min) { // it needs to be clipped // you need to find the intersected points now

clip (B,A); E=TMP; clip (C,A); F=TMP; draw_triangle(A,E,F); continue; }

If it still hasn't continued, we will get a quad:

Just find the intersected points and draw two triangles.

For comments, insults, threats, email bombs or if you need help, contact me.

Greetings go to: kalms, kombat, sosay, velocity, mrz_ai, phred, nick-s, borzom, civax, smallbrain, yoyo, trashey, cycat, adok, cube, radium, lord^crc, gfunk, coaxcable, adept, trip, satanic jungle, gyr, octan, bananmos, biomass, idiotboy, gash, macaw, matja, parody, tanis, timluther, TNSe^98, xls, zippy, sarix, sagacity, gash, asm[exe], the lotus. I hope that I didn't forget somebody.

**
- MasterBoy
**

ICQ: 14054887