002_视图变换矩阵

games101 https://sites.cs.ucsb.edu/~lingqi/teaching/resources/GAMES101_Lecture_04.pdf

https://www.cnblogs.com/charlee44/p/11623502.html
https://www.cnblogs.com/charlee44/p/12828887.html#24-%E8%A7%86%E5%9B%BE%E5%8F%98%E6%8D%A2%E7%9F%A9%E9%98%B5

视图变换矩阵 M v i e w M_{view} Mview

1、相机定义

position: e y e eye eye
lookAt g g g
up: t t t

2、观察(相机)坐标系
  • U = g × t U = g\times t U=g×t
  • V = t V = t V=t
  • N = − g N = -g N=g

M v i e w = R v i e w T v i e w M_{view} = R_{view}T_{view} Mview=RviewTview

T v i e w = [ 1 0 0 − T x 0 1 0 − T y 0 0 1 − T z 0 0 0 1 ] T_{view} = \left[ \begin{matrix} 1 & 0 & 0 & -T_x \\ 0 & 1 & 0 & -T_y\\ 0 & 0 & 1 & -T_z\\ 0 & 0 & 0 & 1 \\ \end{matrix} \right] Tview=100001000010TxTyTz1

目标: 相机坐标系变换到世界坐标系

  • 平移 相机位置 -> 原点(0,0,0)
  • 旋转 g to -Z
  • 旋转 t to Y,
  • 旋转 (g x t) To X

由于从相机坐标系变换到世界坐标系比较复杂,所以考虑它的逆变换: 世界坐标系转观察坐标系

3、世界坐标系转观察坐标系
  • 原点(0,0,0)->相机位置 (平移)
  • X轴(1,0,0) -> U (旋转)
  • Y轴(0,1,0) -> V (旋转)
  • Z轴(0,0,1) -> N (旋转)

R [ X Y Z ] = [ U V N ] R \left[ \begin{matrix} X & Y & Z \end{matrix} \right] = \left[ \begin{matrix} U & V & N \end{matrix} \right] R[XYZ]=[UVN]

按列展开:
R [ 1 0 0 0 1 0 0 0 1 ] = [ U x V x N x U y V y N y U z V z N z ] R \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{matrix} \right] = \left[ \begin{matrix} U_x & V_x & N_x \\ U_y & V_y & N_y \\ U_z & V_z & N_z \\ \end{matrix} \right] R100010001=UxUyUzVxVyVzNxNyNz

因此:
R = [ U V N ] = [ U x V x N x U y V y N y U z V z N z ] R = \left[ \begin{matrix} U & V & N \end{matrix} \right] = \left[ \begin{matrix} U_x & V_x & N_x \\ U_y & V_y & N_y \\ U_z & V_z & N_z \\ \end{matrix} \right] R=[UVN]=UxUyUzVxVyVzNxNyNz

旋转矩阵R为正交矩阵,所以有:
R v i e w = R − 1 = [ U x U y U z V y V y V z N x N y N z ] R_{view} = R^{-1} = \left[ \begin{matrix} U_x & U_y & U_z \\ V_y & V_y & V_z \\ N_x & N_y & N_z \\ \end{matrix} \right] Rview=R1=UxVyNxUyVyNyUzVzNz

4、视图变换矩阵

M v i e w = R v i e w T v i e w M_{view} = R_{view}T_{view} Mview=RviewTview

M v i e w = [ 1 0 0 − T x 0 1 0 − T y 0 0 1 − T z 0 0 0 1 ] [ U x U y U z 0 V y V y V z 0 N x N y N z 0 0 0 0 1 ] M_{view} = \left[ \begin{matrix} 1 & 0 & 0 & -T_x \\ 0 & 1 & 0 & -T_y\\ 0 & 0 & 1 & -T_z\\ 0 & 0 & 0 & 1 \\ \end{matrix} \right] \left[ \begin{matrix} U_x & U_y & U_z & 0\\ V_y & V_y & V_z & 0\\ N_x & N_y & N_z & 0\\ 0 & 0 & 0 & 1 \\ \end{matrix} \right] Mview=100001000010TxTyTz1UxVyNx0UyVyNy0UzVzNz00001

5、code

https://www.cnblogs.com/charlee44/p/12828887.html#24-%E8%A7%86%E5%9B%BE%E5%8F%98%E6%8D%A2%E7%9F%A9%E9%98%B5

lookAt 函数实现

var eye = new THREE.Vector3(0, 0, 100);
var up = new THREE.Vector3(0, 1, 0);
var at = new THREE.Vector3(1, 2, 3);

var N = new THREE.Vector3();
N.subVectors(eye, at);
N.normalize();
var U = new THREE.Vector3();
U.crossVectors(up, N);
U.normalize();
var V = new THREE.Vector3();
V.crossVectors(N, U);
V.normalize();

var R = new THREE.Matrix4();
R.set(U.x, U.y, U.z, 0,
    V.x, V.y, V.z, 0,
    N.x, N.y, N.z, 0,
    0, 0, 0, 1);

var T = new THREE.Matrix4();
T.set(1, 0, 0, -eye.x,
    0, 1, 0, -eye.y,
    0, 0, 1, -eye.z,
    0, 0, 0, 1);

var V = new THREE.Matrix4();
V.multiplyMatrices(R, T);
console.log(V);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值