This site is currently read-only as we are migrating to Oracle Forums for an improved community experience. You will not be able to initiate activity until January 31st, when you will be able to use this site as normal.

    Forum Stats

  • 3,890,899 Users
  • 2,269,649 Discussions


3d Theory. vcs to scs transformation.

843799 Member Posts: 49,999
edited Aug 17, 2001 2:53AM in Java 3D
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)
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:

";-) Ragnvald Barth Software engineer


  • Kayaman
    Kayaman Member Posts: 3,844 Silver Trophy
    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
    843799 Member Posts: 49,999
    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
    Kayaman Member Posts: 3,844 Silver Trophy
  • 843799
    843799 Member Posts: 49,999
    z buffering is not simple.
  • Kayaman
    Kayaman Member Posts: 3,844 Silver Trophy
    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
    843799 Member Posts: 49,999
    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
    Kayaman Member Posts: 3,844 Silver Trophy
    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...
This discussion has been closed.