-
Notifications
You must be signed in to change notification settings - Fork 0
/
lookat.c
40 lines (29 loc) · 1.03 KB
/
lookat.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// LookAt matrix code (may be implemented into libpsxgte soon)
#include "lookat.h"
void crossProduct(SVECTOR *v0, SVECTOR *v1, VECTOR *out) {
out->vx = ((v0->vy*v1->vz)-(v0->vz*v1->vy))>>12;
out->vy = ((v0->vz*v1->vx)-(v0->vx*v1->vz))>>12;
out->vz = ((v0->vx*v1->vy)-(v0->vy*v1->vx))>>12;
}
void LookAt(VECTOR *eye, VECTOR *at, SVECTOR *up, MATRIX *mtx) {
VECTOR taxis;
SVECTOR zaxis;
SVECTOR xaxis;
SVECTOR yaxis;
VECTOR pos;
VECTOR vec;
setVector(&taxis, at->vx-eye->vx, at->vy-eye->vy, at->vz-eye->vz);
VectorNormalS(&taxis, &zaxis);
crossProduct(&zaxis, up, &taxis);
VectorNormalS(&taxis, &xaxis);
crossProduct(&zaxis, &xaxis, &taxis);
VectorNormalS(&taxis, &yaxis);
mtx->m[0][0] = xaxis.vx; mtx->m[1][0] = yaxis.vx; mtx->m[2][0] = zaxis.vx;
mtx->m[0][1] = xaxis.vy; mtx->m[1][1] = yaxis.vy; mtx->m[2][1] = zaxis.vy;
mtx->m[0][2] = xaxis.vz; mtx->m[1][2] = yaxis.vz; mtx->m[2][2] = zaxis.vz;
pos.vx = -eye->vx;;
pos.vy = -eye->vy;;
pos.vz = -eye->vz;;
ApplyMatrixLV(mtx, &pos, &vec);
TransMatrix(mtx, &vec);
}