World Coordinates -> Screen Coordinates

Kurt Akeley kurt at cashew.asd.sgi.com
Thu Nov 8 04:04:59 AEST 1990


In article <GLEICHER.90Nov6001706 at OREO.GRAPHICS.CS.CMU.EDU>,
gleicher at CS.CMU.EDU (Michael Gleicher) writes:
|> 
|> Does anyone have an easy way to get from worldspace co-ords to screen
co-ords?
|> (basically do a mapw2 in reverse).
|> I need to do this to use the select routines.
|> 
|> I should be able to grab the matrix off the stack and run my point
through it,
|> although, although I remember reading somewhere that there was an
extra trick
|> to really making it work.

Here's the complete algorithm:

    1.	Transform your point by the current matrix (if in single matrix mode)
	or by the ModelView matrix followed by the Projection matrix (if in
	multiple matrix mode).  Matrix mode is controlled by the mmode()
	command, which also controls which matrix is returned by getmatrix().
	Set the W component of your point to 1.0 prior to transformation.

    2.	Clip the resulting transformed point against all 6 clipping planes:

		if (x > w OR x < -w OR y > w OR ...)
		then the point does not have a screen coordinate

    3.	Project the transformed point by dividing each of x, y, and z by w.

    4.	Map the point to window coordinates using the equations:

		Xwin = Vsx * X + Vcx
		Ywin = Vsy * Y + Vcy
		Zwin = Vsz * Z + Vcz

		Vsx = (right-left+1)/2
		Vsy = (top-bottom+1)/2
		Vsz = (far-near+1)/2
		Vcx = (right+left)/2
		Vcy = (top+bottom)/2
		Vcz = (far+near)/2

    5.	Add the window offset to Xwin and Ywin to get screen coordinates.
	Z values are not affected by window position.

I've written the Z viewport to be identical to the X and Y viewport operations,
but some SGI machines are off by one on this mapping (no big deal usually).
All computations should be done in floating point.  If screen coordinates are
to be coerced to integers (generally not a good idea) be sure to round toward
nearest.  If truncation is easier, add 0.5 to Vcx, Vcy, and Vcz.

-- kurt



More information about the Comp.sys.sgi mailing list