SecondReality/VISU/VISUX.C
2017-09-24 01:45:36 +02:00

81 lines
2.2 KiB
C

// this file contains seldom needed routines used mainly by the object
// converter and utilities. The routines here also use math.
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "c.h"
void calc_setrmatrix_camera(rmatrix *camera,long x2,long y2,long z2,long x,long y,long z,int roll)
{
int a;
long ll;
float f,fx,fy,fz;
rmatrix tmpm;
rmatrix tmpm2;
{
calc_setrmatrix_ident(camera);
camera->x=-x2;
camera->y=-y2;
camera->z=-z2;
{
double fx,fy,fz,gx,gy,gz,hx,hy,hz;
double fd;
/* Z */
fx=(double)(x-x2);
fy=(double)(y-y2);
fz=(double)(z-z2);
fd=1/sqrt(fx*fx+fy*fy+fz*fz);
fx*=fd; fy*=fd; fz*=fd;
/* X */
hx=fy;
hy=-fx;
hz=0;
fd=1/sqrt(hx*hx+hy*hy+hz*hz);
hx*=fd; hy*=fd; hz*=fd;
/* Y */
gx=fy*hz-hy*fz;
gy=fz*hx-hz*fx;
gz=fx*hy-hx*fy;
fd=1/sqrt(gx*gx+gy*gy+gz*gz);
gx*=fd; gy*=fd; gz*=fd;
tmpm.m[0]=(long)(UNIT*( hx ));
tmpm.m[1]=(long)(UNIT*( gx ));
tmpm.m[2]=(long)(UNIT*( fx ));
tmpm.m[3]=(long)(UNIT*( hy ));
tmpm.m[4]=(long)(UNIT*( gy ));
tmpm.m[5]=(long)(UNIT*( fy ));
tmpm.m[6]=(long)(UNIT*( hz ));
tmpm.m[7]=(long)(UNIT*( gz ));
tmpm.m[8]=(long)(UNIT*( fz ));
tmpm.x=tmpm.y=tmpm.z=0;
}
#if 0
print("ORIGINAL:\n");
print("%6i %6i %6i\n",tmpm.m[0],tmpm.m[1],tmpm.m[2]);
print("%6i %6i %6i\n",tmpm.m[3],tmpm.m[4],tmpm.m[5]);
print("%6i %6i %6i\n",tmpm.m[6],tmpm.m[7],tmpm.m[8]);
memcpy(&tmpm2,&tmpm,sizeof(rmatrix));
a=calc_invrmatrix(&tmpm);
print("INVERSE (det=%i):\n",a);
print("%6i %6i %6i\n",tmpm.m[0],tmpm.m[1],tmpm.m[2]);
print("%6i %6i %6i\n",tmpm.m[3],tmpm.m[4],tmpm.m[5]);
print("%6i %6i %6i\n",tmpm.m[6],tmpm.m[7],tmpm.m[8]);
calc_mulrmatrix(&tmpm2,&tmpm);
print("ORIGINAL*INVERSE:\n");
print("%6i %6i %6i\n",tmpm2.m[0],tmpm2.m[1],tmpm2.m[2]);
print("%6i %6i %6i\n",tmpm2.m[3],tmpm2.m[4],tmpm2.m[5]);
print("%6i %6i %6i\n",tmpm2.m[6],tmpm2.m[7],tmpm2.m[8]);
#else
calc_invrmatrix(&tmpm);
#endif
calc_mulrmatrix(camera,&tmpm);
calc_setrmatrix_rotxyz(&tmpm,0,-roll,0);
tmpm.x=0; tmpm.y=0; tmpm.z=0;
calc_applyrmatrix(camera,&tmpm);
}
}