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=⎣⎢⎢⎡100001000010−Tx−Ty−Tz1⎦⎥⎥⎤
目标: 相机坐标系变换到世界坐标系
- 平移 相机位置 -> 原点(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]
R⎣⎡100010001⎦⎤=⎣⎡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=R−1=⎣⎡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=⎣⎢⎢⎡100001000010−Tx−Ty−Tz1⎦⎥⎥⎤⎣⎢⎢⎡UxVyNx0UyVyNy0UzVzNz00001⎦⎥⎥⎤
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);