自学计算机图形学10: 北太天元帮助我理解pitch-yaw up 确定的矩阵

%对于开始给定的up方向和 direction方向
% 计算出right 方向 : camera_right = direction x up 再normalize
% 然后根据camera_right方向和direction方向计算出camera_up:
% camera_up = right x direction 再normalize
% 最后得到的camera坐标系的三个轴是
% (right, direction, up)
% 注意: https://learnopengl.com/Getting-started/Camera 这篇文章中的
% direction 不是camera 看向的方向,而是相反的。
% 我们这里和上面的帖子不同,direction 还保持camera 看向的方向
% 也就是 (right, direction, camera_up) 是一个右手系
% https://learnopengl.com/Getting-started/Camera 这篇文章中的
% 的lookat 的矩阵也是怪怪的,可能也会导致模仿者出错。
function ca_axes = camera_axes(up, direction)
up = up(:); % 确保得到的up是一个列向量
direction = direction(:); %确保得到的direction 是一个列向量
%确保输入的direction是一个单位向量
norm_d = norm(direction, 2);
if(norm_d < eps)
error('输入的direction向量接近于0');
end
direction = direction /norm_d;
camera_right = cross( direction, up ); % drection 叉乘 up
% 这个地方要检查一下 是不是direction 和 up 贡献
norm_r = norm(camera_right,2) ; %计算camera_right的2范数
if(norm_r < eps)
error("up 和 direction 共线")
end
camera_right = camera_right / norm_r; %把camera_right单位化
camera_up = cross(camera_right, direction); % right 叉乘 direction
camera_up = camera_up / norm(camera_up, 2);
ca_axes = [ camera_right, direction, camera_up];
end
%绕着方向 n 的旋转变换, 逆时针旋转theta角度
function Mat = glRotate(theta, n)
n = n(:);
n = n / norm(n, 2);
n1 = n(1); n2 = n(2); n3 = n(3);
theta = deg2rad(theta); % 角度转成弧度
c = cos(theta);
s = sin(theta);
Mat = [ ...
c + n1^2*(1-c), n1*n2*(1-c) - n3*s, n1*n3*(1-c) + n2*s ;
n1*n2*(1-c) + n3*s, c + n2^2*(1-c), n2*n3*(1-c) - n1*s ;
n1*n3*(1-c) - n2*s, n2*n3*(1-c) + n1*s, c + n3^2*(1-c);
];
end
% ^ z 轴
% |
% | . y 轴
% | .
% | .
% |_________> x 轴
% 开始的时候人眼看的方向是 y 轴正向, 然后 pitch 和 yaw
%根据 pitch 和 yaw 确定 camer 的方向
% 开始的camera的方向是(0,1,0), 首先绕x轴正向逆时针方向旋转pitch角度
% 然后再绕z轴正向逆时针方向旋转 yaw 角度
% 最后得到的camera的方向
% 例如 pitch_yaw(-90,0) 得到的方向是 (0,0,-1);
% 不过,最后的向量都写成了列向量
function direction = pitch_yaw( pitch, yaw)
direction = [
-cos( deg2rad(pitch) )*sin( deg2rad(yaw) );
cos( deg2rad(pitch) )*cos( deg2rad(yaw) );
sin( deg2rad(pitch) );
];
end