3d Theory. vcs to scs transformation.

Hi you 3d gurus.

Please give me a tip!

If you have a point with coordinates given in the View Coordinate System, how do you translate it to a point on the screen?

The point is given by x,y,z in the view coordinate system (vcs). (x is horizontal, y is vertical, and z is distance stright forward from your eye.)

To obtain where to render the point at the screen, I could do something like this:

iScreenX = (400*vcs.x)/vcs.z;

iScreenY = (400*vcs.y)/vcs.z;

The problem is that this only works for z values grather than 0.

if(vcs.z <= 0)

IHaveAProblem();

Ofcorse, a point with negative (or zero) z- value shold not be shown, however, a polygon might be visible even though one of its vertexes has a negative z- value. Havent found any good solution. So far, I just dont paint the polygon at all if I find a negative or zero z.

I also tried using the distance, and not the z- value as the divisor:

double dDivisor;

dDivisor = Math.sqrt(vcs.x*vcs.x +vcs.y*vcs.y +vcs.z*vcs.z);

iScreenX = (400*vcs.x) / dDivisor;

iScreenY = (400*vcs.y) / dDivisor;

This is ok for all points not beeing positioned in the middle of your eye (givig dDivisor=0), but it gives a fisheye like view of the world, and thats not exactly what I want.

I want something close to the first solution, but that also works on negative and 0 z values.

Anybody knows?

This is my 3d engine:

http://blake.prohosting.com/ragnvald/

";-)

Ragnvald Barth

Software engineer

[1679 byte] By [Ragnvald] at [2007-9-26 3:54:57]
# 1

Well, as jsalonen (and I) said in the other forum, it involves some tricky stuff. You can either use clipping (check where the polygons collide with the viewpoint and 'clip' them, creating new polygons that can be drawn) or Z buffering, which produces the best quality but also needs extra memory, the size of the view screen actually. So z buffering sucks memory a lot. Then the easiest way is that you don't draw polygons that are too near you.

Kayaman at 2007-6-29 12:44:37 > top of Java-index,Security,Cryptography...
# 2

The easy solution, (not to draw at all) works fine for the "fligt simulator" with an open landscape. However, if I create a world where I move around in caves, the problem becomes too visible (does it have to be like that?). And cliping isnt that easy eather, bebcause I have not restricted the polygons to triangles...

Ragnvald at 2007-6-29 12:44:37 > top of Java-index,Security,Cryptography...
# 3
Z buffering.
Kayaman at 2007-6-29 12:44:37 > top of Java-index,Security,Cryptography...
# 4
z buffering is not simple.
Ragnvald at 2007-6-29 12:44:37 > top of Java-index,Security,Cryptography...
# 5
Well, actually it's not that difficult. Of course you need to make some modifications, but if you can handle the speed and memory requirements it gives the best quality.
Kayaman at 2007-6-29 12:44:37 > top of Java-index,Security,Cryptography...
# 6

Well. width zBuffering I would have to write my own fillPolygon routine. And I would have to draw on pixel level. And all the modifications that follow... And the speed would be a problem (after all this is an applet). - I am not looking for the correct solution. I am looking for a dirty cheap and ugly solution that makes my problem less visible!

Ragnvald at 2007-6-29 12:44:37 > top of Java-index,Security,Cryptography...
# 7
Well, if you intend to do any shading you have to write your own fillPolygon routine anyway. Anyhow, I don't know of an easy solution to your problem...
Kayaman at 2007-6-29 12:44:37 > top of Java-index,Security,Cryptography...