File: gluLookAt.m

package info (click to toggle)
psychtoolbox-3 3.0.19.14.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 86,796 kB
  • sloc: ansic: 176,245; cpp: 20,103; objc: 5,393; sh: 2,753; python: 1,397; php: 384; makefile: 193; java: 113
file content (69 lines) | stat: -rw-r--r-- 1,546 bytes parent folder | download | duplicates (6)
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function gluLookAt( eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ )

% gluLookAt  Interface to OpenGL function gluLookAt
%
% usage:  gluLookAt( eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ )
%
% C function:  void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ)

% 25-Mar-2011 -- created (generated automatically from header files)
%  4-Apr-2013 -- Manually added Matlab implementation for OpenGL-ES1.x

% ---protected---

if nargin~=9,
    error('invalid number of arguments');
end

% OpenGL-ES1 active?
if ~IsGLES1
    % No. Dispatch to GLU:
    moglcore( 'gluLookAt', eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ );
    return;
end

% Yes. Need to implement gluLookAt() manually here.
forward(1) = centerX - eyeX;
forward(2) = centerY - eyeY;
forward(3) = centerZ - eyeZ;
forward = normalize(forward);

up(1) = upX;
up(2) = upY;
up(3) = upZ;
up = normalize(up);

% Side = forward x up
side = cross(forward, up);
side = normalize(side);

% Recompute up as: up = side x forward
up = cross(side, forward);

m = diag([1 1 1 1]);
m(1,1) = side(1);
m(2,1) = side(2);
m(3,1) = side(3);

m(1,2) = up(1);
m(2,2) = up(2);
m(3,2) = up(3);

m(1,3) = -forward(1);
m(2,3) = -forward(2);
m(3,3) = -forward(3);

glMultMatrixf(m');
glTranslatef(-eyeX, -eyeY, -eyeZ);

return;

% Normalize vector to unit-length:
function v = normalize(v)
    l = norm(v);
    if l == 0
        return;
    end

    v = v / l;
return;