[comp.sys.hp] Using Right Hand Coordinate System in Starbase

neil@yc.estec.nl (Neil Dixon) (04/10/90)

To any starbase expert out there!

Some time ago I posted a request asking how to use a R.H.S. in Starbase, but got no response. I'm hoping this time I'm a bit luckier.

Looking through the Starbase manuals, it appears that the way to get a R.H.S.
in starbase is:-

    define matrix left_to_right, which is identity except Z scale element is -1
    set up camera structure and call view_camera
    call view_matrix3d with left_to_right matrix and mode PRE_CONCAT_VW

    push transformation matrix left_to_right
    draw whatever you want
    make_picture_current.


This doesn't seem to work, since the net effect is still a left hand system. What
is missing? An example program demonstrating my difficulties follows.
	

Neil Dixon <neil@yc.estec.nl> UUCP:...!mcvax!esatst!neil, BITNET: NDIXON@ESTEC
Thermal Control & Life Support Division (YC) 
European Space Research and Technology Centre (ESTEC),
Noordwijk, The Netherlands.



/* ------------------------- Cut Here ----------------------*/
#include <starbase.c.h>
#include <math.h>


main(argc, argv)
int argc;
char **argv;
{
    int fd;
    camera_arg	camera;
    float xval, yval, zval;
    float theta;
    static float left_to_right[4][4] = { /* use r.h. coord system */
	{ 1.0, 0.0, 0.0, 0.0},
	{ 0.0, 1.0, 0.0, 0.0},
	{ 0.0, 0.0,-1.0, 0.0},
	{ 0.0, 0.0, 0.0, 1.0}
    };

    system("xwcreate -geometry 400x400 rhs");

    fd = gopen("/dev/screen/rhs", OUTDEV, "sox11", INIT|THREE_D);

    text_alignment(fd, TA_LEFT, TA_TOP, 0.0, 0.0);

    xval = 1.0;
    yval = 1.0;
    zval = 1.0;

    vdc_extent(fd, -2.0, -2.0, -2.0, 2.0, 2.0, 2.0);

    character_height(fd, 0.2);
    line_color(fd, 1.0, 1.0, 1.0);
    text_color(fd, 1.0, 1.0, 1.0);
    background_color(fd, 0.0, 0.0, 0.0);

    camera.refx = camera.refy = camera.refz = 0.0;

    camera.upx = camera.upz = 0.0;
    camera.upy = 1.0;
    camera.field_of_view = 60.0;

    camera.front = camera.back = 0.0;
    camera.projection = CAM_PERSPECTIVE;

    theta = 0.0;
    camera.camy = 2.0;

    push_matrix3d(fd, left_to_right);

    while (1) {
	camera.camx = 2.0 * sin(theta);
	camera.camz = 2.0 * cos(theta);
	theta = fmod(theta + M_PI/180.0, 2 * M_PI);

	view_camera(fd, &camera);
	view_matrix3d(fd, left_to_right, PRE_CONCAT_VW);
	
	clear_view_surface(fd);
	move3d(fd, 0.0, 0.0, 0.0);
	draw3d(fd, xval, 0.0, 0.0);
	text3d(fd, xval, 0.0, 0.0,"X",WORLD_COORDINATE_TEXT,0);

	move3d(fd, 0.0, 0.0, 0.0);
	draw3d(fd,  0.0, yval, 0.0);
	text3d(fd, 0.0, yval, 0.0,"Y",WORLD_COORDINATE_TEXT,0);

	move3d(fd, 0.0, 0.0, 0.0);
	draw3d(fd,  0.0, 0.0, zval);
	text3d(fd,	0.0, 0.0, zval,"Z",WORLD_COORDINATE_TEXT,0);
	make_picture_current(fd);
    }


    gclose(fd);
}

stroyan@hpfcso.HP.COM (Mike Stroyan) (04/11/90)

> Looking through the Starbase manuals, it appears that the way to get a R.H.S.
> in starbase is:-
...
> This doesn't seem to work, since the net effect is still a left hand system.
> What is missing? An example program demonstrating my difficulties follows.
> Neil Dixon

You can get the result you want by either-
 1) using gopen with MODEL_XFORM
or
 2) repeating "push_matrix3d(fd, left_to_right);" after view_matrix3d

If you are not in MODEL_XFORM mode, then view_matrix3d will pop off all
of the transforms on the current transform matrix stack, since they all
have the old view matrix concatenated into them.  In MODEL_XFORM mode
the modelling transforms are kept separate and do not need to be flushed.

Mike Stroyan, stroyan@hpfcla.hp.com