Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

3d Theory. vcs to scs transformation.

843799Aug 14 2001 — edited Aug 17 2001
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

Comments

Kayaman
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.
843799
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...
Kayaman
Z buffering.
843799
z buffering is not simple.
Kayaman
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.
843799
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!
Kayaman
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...
1 - 7
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Sep 14 2001
Added on Aug 14 2001
7 comments
204 views