V_ROTLU2RO converts look and up directions to a rotation matrix Inputs: L(3,...) Vector specifying look direction (need not be a unit vector) U(3,...) Vector specifying up direction. Default is u=[0 0 1]' unless l is a multiple of this, in which case u=[0 1 0]'. Outputs: R(3,3,...) Equivalent rotation matrix The rotation maps the look direction to the negative z-axis and the up direction to lie in the y-z plane with a positive y component. That is, R*L=a*[0 0 -1]' and R*U=b*[0 1 c] for postive constants a and b. After applying this rotation to an object, the 2-D data obtained by omitting the z-component represents an orthographic projection performed by a camera looking in the direction L.
0001 function r=v_rotlu2ro(l,u) 0002 %V_ROTLU2RO converts look and up directions to a rotation matrix 0003 % Inputs: L(3,...) Vector specifying look direction (need not be a unit vector) 0004 % U(3,...) Vector specifying up direction. Default is u=[0 0 1]' 0005 % unless l is a multiple of this, in which case u=[0 1 0]'. 0006 % 0007 % Outputs: R(3,3,...) Equivalent rotation matrix 0008 % 0009 % The rotation maps the look direction to the negative z-axis and the up direction 0010 % to lie in the y-z plane with a positive y component. That is, R*L=a*[0 0 -1]' and 0011 % R*U=b*[0 1 c] for postive constants a and b. After applying this rotation to an object, 0012 % the 2-D data obtained by omitting the z-component represents an orthographic projection 0013 % performed by a camera looking in the direction L. 0014 0015 % Copyright (C) Mike Brookes 2023 0016 % Version: $Id: v_rotlu2ro.m 10865 2018-09-21 17:22:45Z dmb $ 0017 % 0018 % VOICEBOX is a MATLAB toolbox for speech processing. 0019 % Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html 0020 % 0021 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0022 % This program is free software; you can redistribute it and/or modify 0023 % it under the terms of the GNU General Public License as published by 0024 % the Free Software Foundation; either version 2 of the License, or 0025 % (at your option) any later version. 0026 % 0027 % This program is distributed in the hope that it will be useful, 0028 % but WITHOUT ANY WARRANTY; without even the implied warranty of 0029 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0030 % GNU General Public License for more details. 0031 % 0032 % You can obtain a copy of the GNU General Public License from 0033 % http://www.gnu.org/copyleft/gpl.html or by writing to 0034 % Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA. 0035 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0036 persistent mk 0037 if isempty(mk) 0038 mk=cat(3,repmat([-1;1;-1],1,3),repmat([1;-1;-1],1,3),repmat([1;1;1],1,3),repmat([-1;-1;1],1,3)); 0039 end 0040 sz=size(l); 0041 l=reshape(l,3,[]); % make 2-dimensional 0042 n=size(l,2); % number of rotation matrices to generate 0043 if n==1 0044 r=zeros(3,3); 0045 else 0046 r=zeros([3 3 sz(2:end)]); 0047 end 0048 if nargin<2 0049 u=repmat([0;0;1],1,n); 0050 u(2,:)=u(2,:)+(l(1,:)==0 & l(2,:)==0); 0051 end 0052 for i=1:n 0053 [q,t]=qr([l(:,i) u(:,i)]); 0054 rx=[cross(q(:,2),q(:,1)) q(:,2) q(:,1)]'; 0055 r(:,:,i)=rx.*mk(:,:,2*(rx(3,:)*l(:,i)<0)+(rx(2,:)*u(:,i)<0)+1); 0056 end 0057 if ~nargout 0058 v_rotro2qr(r(:,:,1)); % plot a cube 0059 set(gca,'CameraPosition',[0 0 1]); 0060 end