t2r.c

/*
 * The view position (vp) and view direction (vd) are clear.  Vup has to
 * be flipped.  Intrinsic parameters are defined by the size of the image
 * itself.  That is, as exposed by 'Realistic Ray Tracing, 2nd Ed.', two
 * opposite corners of the rectangle.  The center of projection and the 
 * filed of view is given or deduced from the size (and position) and 
 * this rectangle.
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "cal_main.h"


int main(int argc, char **argv)
{
    FILE *fp;
    double vp_x, vp_y, vp_z;
    double vd_x, vd_y, vd_z;
    double vu_x, vu_y, vu_z;
    double w, h, fov_x, fov_y;
    double fx, fy;
    int width, height;

    if(argc != 4) {
	fprintf(stderr, "Usage %s tsai_file width height.\n", argv[0]);
	return 1;
    }

    if((fp=fopen(argv[1], "r")) == NULL) {
	fprintf(stderr, "Can't open %s\n", argv[1]);
	return 1;
    }

    width = atoi(argv[2]);
    height = atoi(argv[3]);

    load_cp_cc_data(fp, &cp, &cc);
    print_cp_cc_data(stderr, &cp, &cc);

    // -R'*t, not -R*t
    // or: camera_coord_to_world_coord(0,0,0,&vp_x,&vp_y,&vp_z);
    vp_x = -(cc.r1 * cc.Tx + cc.r4 * cc.Ty + cc.r7 * cc.Tz);
    vp_y = -(cc.r2 * cc.Tx + cc.r5 * cc.Ty + cc.r8 * cc.Tz);
    vp_z = -(cc.r3 * cc.Tx + cc.r6 * cc.Ty + cc.r9 * cc.Tz);

    /*
     * Vup has to be flipped.  This is Radiance specific. The construction 
     * of the view frame is left-handed.  Only after Radiance flips row
     * number to 'real' y value, does the frame become right-handed
     */
    vu_x = - cc.r4; vu_y = - cc.r5; vu_z = - cc.r6;

    vd_x = cc.r7; vd_y = cc.r8; vd_z = cc.r9;

    /*
     * w and h are the size of the sensor, which is mapped exactly
     * to the image region used by the ray tracer
     */
    w = cp.dpx * width;
    h = cp.dpy * height;
    /*
     * fov is just another way to specify the size of the image region
     * it has nothing to do with shift/lift.
     * Note the fov of x direction is larger
     */
    fov_x = 2*atan(w/(2.*(cc.f*cp.sx)));
    fov_y = 2*atan(h/(2.*cc.f));

    printf("rpict -vp %g %g %g ", vp_x, vp_y, vp_z);
    printf("-vd %g %g %g ", vd_x, vd_y, vd_z);
    printf("-vu %g %g %g ", vu_x, vu_y, vu_z);

    printf("-vh %g ", fov_x*180./M_PI);
    printf("-vv %g ", fov_y*180./M_PI);

    /* 
     * the signs of vl and vs are set by trial-and-error
     */
    printf("-vl %g ", (cp.Cy/height-0.5));
    printf("-vs %g\n", -(cp.Cx/width-0.5));
    fprintf(stderr,"-x %d -y %d -pa 0\n", width, height);
}


Generated by GNU enscript 1.6.1.