当前位置: 首页 > Web前端 > JavaScript

三矩阵优先原则与平移旋转矩阵

时间:2023-03-26 21:38:55 JavaScript

优先顺序Rowpriority[1,2,3,45,6,7,8,9,10,11,12]如果是rowpriority,以上读取顺序是1234,5678,9101112columnpriority[1,2,3,45,6,7,8,9,10,11,12]如果是rowpriority,上面的读取顺序是159,2610,3711,4812THREEpriorityruleall内部计算存储的矩阵都是列优先,但是行优先更适合人的阅读顺序,所以Matrix.set方法采用行优先读取,所有读取都是列优先。consta=newTHREE.Matrix3()a.set(1,2,3,4,5,6,7,8,9)console.log('矩阵:====>',a.elements)//(9)[1,4,7,2,5,8,3,6,9]为了便于阅读,以下矩阵均以行优先行优先列优先的集合显示(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){constte=this.elements;te[0]=n11;te[4]=n12;te[8]=n13;te[12]=n14;te[1]=n21;te[5]=n22;te[9]=n23;te[13]=n24;te[2]=n31;te[6]=n32;te[10]=n33;[14]=n34;te[3]=n41;te[7]=n42;te[11]=n43;te[15]=n44;Matrix,所有矩阵计算都会转化为列优先ApplyMatrix4applyMatrix4(m){constx=this.x,y=this.y,z=this.z;conste=m.elements;常量w=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*w;this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*w;this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*w;归还这个;}applyMatrix4的参数m是按照上面的方法通过set方法转换的列优先级矩阵,很容易得到转换矩阵:consta=newTHREE.Matrix4()a.set(1,0,0,1,0,1,0,1,0,0,1,1,0,0,0,1)这是将xyz分别平移1个单位的矩阵,所以我们知道平移矩阵1的一般矩阵,0,0,dx,0,1,0,dy,0,0,1,dz,0,0,0,1对于旋转矩阵,难免和三角函数有关系。对于旋转,逆时针旋转为正角,顺时针旋转为负角。绕X轴的旋转矩阵很容易写成[1,0,0,0,0,cosN,-sinN,0,0,sinN,cosN,0,0,0,0,1]绕任意轴旋转,可以直接看threejs的源码consts=Math.sin(角度);constt=1-c;constx=axis.x,y=axis.y,z=axis.z;consttx=t*x,ty=t*y;this.set(tx*x+c,tx*y-s*z,tx*z+s*y,0,tx*y+s*z,ty*y+c,ty*z-s*x,0,tx*z-s*y,ty*z+s*x,t*z*z+c,0,0,0,0,1);归还这个;}