【模型矩阵】
matrix是某个节点的本地坐标下的模型矩阵
matrixWorld是这个节点的世界坐标下的模型矩阵
因此需要一次相乘
如scene根节点,在render的时候执行scene. updateMatrixWorld
this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
遍历执行计算子节点 孙节点的updatematrix计算得到matrix本地矩阵和updatematrixworld计算得到matrixworld世界矩阵
three中模型矩阵传入是在render函数中
p_uniforms.setValue( _gl, ‘modelMatrix’, object.matrixWorld )
参考:
http://www.yanhuangxueyuan.com/doc/three.js/matrixworld.html
【视图矩阵】
render函数里面scene. updateMatrixWorld后,camera也计算这个,得到相机的世界坐标下的模型矩阵matrixWorld,其逆矩阵matrixWorldInverse就是视图矩阵
render函数里面有
p_uniforms.setValue( _gl, ‘viewMatrix’, camera.matrixWorldInverse );
这里还找到个相机位置挺有用,这个是世界坐标系下的相机位置
const uCamPos = p_uniforms.map.cameraPosition;
uCamPos.setValue( _gl,
_vector3.setFromMatrixPosition( camera.matrixWorld ) );
【投影矩阵】
看camera的属性就行
render函数里面有
p_uniforms.setValue( _gl,‘projectionMatrix’, camera.projectionMatrix );
【法向量】
p_uniforms.setValue( _gl, ‘normalMatrix’, object.normalMatrix );//这个normalMatrix是直接转换到视图坐标下的,所以下面这个想某方向向量和这个求dot的时候,该方向向量需要转到视图坐标系下,如下面https://blog.csdn.net/srk19960903/article/details/78734238
备注:
我感觉他这个顶点到相机的向量左乘视图矩阵有点问题吧,不是要乘逆矩阵的转置吗,但是看three.js ShaderChunk\envmap_physical_pars_fragment.glsl.js 里面也有类似这种乘法,这里有个疑问为什么法向量需要左乘逆转置,而方向向量是左乘正常矩阵
是不是法向量会考虑不等比缩放,而普通方向向量不考虑这个呢
下面是灯光的使用详解
https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/
法向量转到世界坐标需要左乘模型坐标逆矩阵的转置
法向量转到视图坐标左乘模型视图矩阵的逆矩阵的转置
three里面的object.normalMatrix.getNormalMatrix( object.modelViewMatrix );是直接计算视图坐标下的法向量转换矩阵
【three模型视图矩阵】
p_uniforms.setValue( _gl, ‘modelViewMatrix’, object.modelViewMatrix );