function a=viewmtx(az,el,phi,target) %VIEWMTX View transformation matrix. % A=VIEWMTX(AZ,EL) returns the 4x4 orthographic transformation % matrix, A, used to project 3-D vectors onto the 2-D plot surface. % Uses the same definition for azimuth and elevation as VIEW, in % particular, AZ and EL must be in degrees. Returns the same % transformation matrix as the commands % VIEW(AZ,EL) % A = VIEW % but doesn't change the current VIEW. % % A=VIEWMTX(AZ,EL,PHI) returns a 4x4 perspective transformation % matrix used to project 3-D vectors onto the 2-D plot surface. % PHI is the subtended view angle of the normalized plot cube % (in degrees) and controls the amount of perspective distortion: % PHI = 0 degrees is orthographic projection % PHI = 10 degrees is like a telephoto lens % PHI = 25 degrees is like a normal lens % PHI = 60 degrees is like a wide angle lens % % A=VIEWMTX(AZ,EL,PHI,XC) returns the perspective transformation % matrix using XC as the target (or look-at) point within % the normalized plot cube. XC=[xc,yc,zc] specifies the % point (xc,yc,zc) in the plot cube. The default value is % the closest point in the plot cube, % % XC = 0.5+sqrt(3)/2*[cos(EL)*sin(AZ),-cos(EL)*cos(AZ),sin(EL)]. % % See also VIEW. % Clay M. Thompson 5-1-91 % Revised 12-17-91, 3-10-92 by CMT error(nargchk(2,4,nargin,'struct')); if nargin==2, phi = 0; end if nargin>2, if phi>0, d = sqrt(2)/2/tan(phi*pi/360); else phi = 0; end end % Make sure data is in the correct range. el = rem(rem(el+180,360)+360,360)-180; % Make sure -180 <= el <= 180 if el>90, el = 180-el; az = az + 180; elseif el<-90, el = -180-el; az = az + 180; end az = rem(rem(az,360)+360,360); % Make sure 0 <= az <= 360 % Convert from degrees to radians. az = az*pi/180; el = el*pi/180; if nargin>3, target = target(:); % Make sure its a vector. if length(target)~=3 error(message('MATLAB:viewmtx:InvalidInput')); end else target = 0.5 + sqrt(3)/2*[cos(el)*sin(az);-cos(el)*cos(az);sin(el)]; end % View transformation matrix: % Formed by composing two rotations: % 1) Rotate about the z axis -AZ radians % 2) Rotate about the x axis (EL-pi/2) radians T = [ cos(az) sin(az) 0 0 -sin(el)*sin(az) sin(el)*cos(az) cos(el) 0 cos(el)*sin(az) -cos(el)*cos(az) sin(el) 0 0 0 0 1 ]; if nargin==2 || phi==0, a = T; return, end % Return orthographic transformation. f = d; % Default focal length. % Transformation to move origin of object coordinate system to TARGET O1 = [eye(4,3),T*[-target;1]]; % Perspective transformation P = [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 -1/f d/f]; % The perspective transformation above works because the graphics % system divides by the homogenous length, w, before mapping to the screen. % If the homegeous vector is given by V = [x,y,z,w] then the transformed % point is U = [x/w y/w]. % Using f = d places the image plane through the origin of the object % coordinate system, thus projecting the object onto this plane. Note only % the x and y coordinates are used to draw the object in the graphics window. % Form total transformation a=P*O1*T;