在实际开发过程中,有时候建模是用的左手坐标系,但webgl用的是右手坐标系,这中间就涉及一个矩阵的转换。这里建模人员给出的是本地坐标和一个世界坐标到本地坐标的转换矩阵,这个转换矩阵是基于左手坐标系的,通过本地坐标与转换矩阵可以计算出世界坐标。
世界坐标到本地坐标的转换矩阵如下:
"matGlobal2Local":[
[ 1, 0, 0, 0 ],
[ 0,-1, 0, 0 ],
[ 0, 0, 1, 0 ],
[ 0, 0, 0, 1 ]
]
由于我们要将本地坐标转换成世界坐标,所以要求出matGlobal2Local矩阵的逆矩阵。
var local = matGlobal2Local;
var matrix = new Matrix4();
matrix.set(
local[ 0 ][ 0 ], local[ 0 ][ 1 ], local[ 0 ][ 2 ], local[ 0 ][ 3 ],
local[ 1 ][ 0 ], local[ 1 ][ 1 ], local[ 1 ][ 2 ], local[ 1 ][ 3 ],
local[ 2 ][ 0 ], local[ 2 ][ 1 ], local[ 2 ][ 2 ], local[ 2 ][ 3 ],
local[ 3 ][ 0 ], local[ 3 ][ 1 ], local[ 3 ][ 2 ], local[ 3 ][ 3 ],
)
matrix.getInverse( matrix );
把所有的顶点、法线转换成四维齐次坐标,与求出来的逆矩阵相乘。
var vertex= new Vector4( x, y, z, w ); // 需要注意的是,顶点w为1,法线为0
vertex.applyMatrix4( matrix );
算出来的顶点就是基于左手坐标的世界坐标了