webGL:沿Y轴围绕点旋转矩形

webGL:沿Y轴围绕点旋转矩形,webgl,Webgl,假设我有一个矩形,有4个顶点x1,y1,x2,y2,x3,y3和x4,y4。这些顶点按顺时针顺序排列。矩形的方向类似于x1,y1是最左上角,x3,y3是最右下角 现在,我想沿着包含x2、y2和x3、y3的边围绕其中一条边i、e旋转矩形。我想通过旋转两个顶点x1、y1和x4、y4在着色器中实现此效果 我的问题是,旋转一个点x1,y1的公式是什么,旋转角度θ围绕某一点 我搜索了老论坛,找到了一些相关信息 我的问题是我能不能用这个等式。。因为它类似于绕Y轴旋转。基本上是围绕向量旋转对象,需要平移并旋

假设我有一个矩形,有4个顶点x1,y1,x2,y2,x3,y3和x4,y4。这些顶点按顺时针顺序排列。矩形的方向类似于x1,y1是最左上角,x3,y3是最右下角

现在,我想沿着包含x2、y2和x3、y3的边围绕其中一条边i、e旋转矩形。我想通过旋转两个顶点x1、y1和x4、y4在着色器中实现此效果

我的问题是,旋转一个点x1,y1的公式是什么,旋转角度θ围绕某一点

我搜索了老论坛,找到了一些相关信息


我的问题是我能不能用这个等式。。因为它类似于绕Y轴旋转。

基本上是围绕向量旋转对象,需要平移并旋转它,如果需要,该向量将显示在中间,因此对象将定位在向量局部坐标系中。然后应用旋转,然后将对象放回原来的位置。是图书馆的好帮手

基本上,要围绕矢量旋转对象,需要平移并旋转(如果需要),使该矢量显示在中间,以便将对象定位在矢量局部坐标系中。然后应用旋转,然后将对象放回原来的位置。是图书馆的好帮手

这里有一系列文章讨论了2D旋转的数学问题

它的开始很简单,并建立了二维矩阵数学,这是最常见的方式做这件事

一旦你有了矩阵,你就可以生成一个矩阵来平移矩形,这样X2,y2和x3,y3之间的点就是0,0。然后生成一个旋转的矩阵。然后再翻译回来。把它们都乘在一起,你会得到一个矩阵,完成整个过程

// Compute the matrices
var rotatePointX = (x2 + x3) / 2;
var rotatePointY = (y2 + y3) / 2;

var moveToRotationPointMatrix = makeTranslation(-rotatePointX, -rotatePointY);
var rotationMatrix = makeRotation(angleInRadians);
var moveBackMatrix = makeTranslation(rotatePointX, rotatePointY);

// Multiply the matrices.
var matrix = matrixMultiply(moveToRotationPointMatrix, rotationMatrix);
matrix = matrixMultiply(matrix, moveBackMatrix);
...
现在使用这个矩阵

这里有一个例子。它绕着右边缘的中心在中间旋转

主要功能{ //获取WebGL上下文 var canvas=document.getElementByIdcanvas; var gl=canvas.getContextwebgl; 如果!德国劳埃德船级社{ 回来 } //安装GLSL程序 program=twgl.createProgramFromScriptsgl,[2d顶点着色器,2d片段着色器]; gl.useprogrammProgram; //查找顶点数据需要去的地方。 var positionLocation=gl.GetAttriblLocationProgram,一个位置; //查找制服 var colorLocation=gl.getUniformLocationprogram,u_颜色; var matrixLocation=gl.GetUniformLocation程序,u_矩阵; //创建一个缓冲区。 var buffer=gl.createBuffer; gl.bindBuffergl.ARRAY_BUFFER,BUFFER; gl.EnableVertexAttributeArrayPositionLocation; gl.VertexAttributePointerPositionLocation,2,gl.FLOAT,false,0,0; //设置几何图形。 setGeometrygl; //设置一个随机颜色。 gl.uniform4fcolorLocation,Math.random,Math.random,Math.random,1; var转换=[100150]; var角半径=0; var标度=[1,1]; //画场景。 功能绘图场景{ 角半径+=0.01; //清理画布。 gl.cleargl.COLOR\u缓冲位; //计算矩阵 var projectionMatrix=make2DProjectioncanvas.width,canvas.height; var x2=130; var x3=130; 变量y2=30; var y3=150; var rotatePointX=x2+x3/2; var rotatePointY=y2+y3/2; var moveToRotationPointMatrix=makeTranslation-rotatePointX,-rotatePointY; var rotationMatrix=makeRotationangleInRadians; var moveBackMatrix=makeTranslationrotatePointX,rotatePointY; //将矩阵相乘。 var矩阵=矩阵多点矩阵、旋转矩阵; 矩阵=矩阵MultiplyMatrix,moveBackMatrix; 矩阵=矩阵多重矩阵,投影矩阵; //设定矩阵。 gl.uniformMatrix3fvmatrixLocation,false,矩阵; //绘制几何图形。 gl.drawArraysgl.TRIANGLES,0,6; requestAnimationFramedrawScene; } 绘画场景; } 函数make2DProjectionwidth、height{ //注意:此矩阵翻转Y轴,因此0位于顶部。 返回[ 2/宽度,0,0, 0,-2/高度,0, -1, 1, 1 ]; } 函数makeTranslationtx,ty{ 返回[ 1, 0, 0, 0, 1, 0, 德克萨斯州,泰,1 ]; } 函数makeRotationangleInRadians{ var c=数学余角半径; var s=数学正弦半径; 返回[ c、 -s,0, s、 c,0, 0, 0, 1 ]; } 函数makescalex,sy{ 返回[ sx,0,0, 0,sy,0, 0, 0, 1 ]; } 函数矩阵multiplya,b{ var a00=a[0*3+0]; var a01=a[0*3+1]; var a02=a[0*3+2]; var a10=a[1*3+0]; var a11=a[1*3+1]; var a12=a[1*3+2]; var a20=a[2*3+0]; var a21=a[2*3+1]; var a22=a[2*3+2]; var b00=b[0*3+0]; var b01=b[0*3+1]; var b02=b[0*3+2]; 变量b10=b[1*3+0]; 变量b11=b[1*3+1]; 变量b12=b[1*3+2]; var b20=b[2*3+0]; var b21=b[2*3+1]; var b22=b[2*3+2]; 返回[a00*b00+a01*b10+a02*b20, a00*b01+a01*b11 +a02*b21, a00*b02+a01*b12+a02*b22, a10*b00+a11*b10+a12*b20, a10*b01+a11*b11+a12*b21, a10*b02+a11*b12+a12*b22, a20*b00+a21*b10+a22*b20, a20*b01+a21*b11+a22*b21, a20*b02+a21*b12+a22*b22]; } //用构成rect的值填充缓冲区。 函数集GeometryGL{ 缓冲数据 gl.ARRAY\u缓冲区, 新浮点数组[ 10, 30, 130, 30, 10, 150, 10, 150, 130, 30, 130, 150], gl.静态绘制; } 主要的 帆布{ 边框:1px纯黑; } 属性向量2 a_位置; 均匀mat3u_矩阵; 真空总管{ //将位置乘以矩阵。 gl_位置=vec4u_矩阵*vec3a_位置,1.xy,0,1; } 精密中泵浮子; 均匀的vec4 u_颜色; 真空总管{ gl_FragColor=u_颜色; }
这里有一系列关于二维旋转的文章

它的开始很简单,并建立了二维矩阵数学,这是最常见的方式做这件事

一旦你有了矩阵,你就可以生成一个矩阵来平移矩形,这样X2,y2和x3,y3之间的点就是0,0。然后生成一个旋转的矩阵。然后再翻译回来。把它们都乘在一起,你会得到一个矩阵,完成整个过程

// Compute the matrices
var rotatePointX = (x2 + x3) / 2;
var rotatePointY = (y2 + y3) / 2;

var moveToRotationPointMatrix = makeTranslation(-rotatePointX, -rotatePointY);
var rotationMatrix = makeRotation(angleInRadians);
var moveBackMatrix = makeTranslation(rotatePointX, rotatePointY);

// Multiply the matrices.
var matrix = matrixMultiply(moveToRotationPointMatrix, rotationMatrix);
matrix = matrixMultiply(matrix, moveBackMatrix);
...
现在使用这个矩阵

这里有一个例子。它绕着右边缘的中心在中间旋转

主要功能{ //获取WebGL上下文 var canvas=document.getElementByIdcanvas; var gl=canvas.getContextwebgl; 如果!德国劳埃德船级社{ 回来 } //安装GLSL程序 program=twgl.createProgramFromScriptsgl,[2d顶点着色器,2d片段着色器]; gl.useprogrammProgram; //查找顶点数据需要去的地方。 var positionLocation=gl.GetAttriblLocationProgram,一个位置; //查找制服 var colorLocation=gl.getUniformLocationprogram,u_颜色; var matrixLocation=gl.GetUniformLocation程序,u_矩阵; //创建一个缓冲区。 var buffer=gl.createBuffer; gl.bindBuffergl.ARRAY_BUFFER,BUFFER; gl.EnableVertexAttributeArrayPositionLocation; gl.VertexAttributePointerPositionLocation,2,gl.FLOAT,false,0,0; //设置几何图形。 setGeometrygl; //设置一个随机颜色。 gl.uniform4fcolorLocation,Math.random,Math.random,Math.random,1; var转换=[100150]; var角半径=0; var标度=[1,1]; //画场景。 功能绘图场景{ 角半径+=0.01; //清理画布。 gl.cleargl.COLOR\u缓冲位; //计算矩阵 var projectionMatrix=make2DProjectioncanvas.width,canvas.height; var x2=130; var x3=130; 变量y2=30; var y3=150; var rotatePointX=x2+x3/2; var rotatePointY=y2+y3/2; var moveToRotationPointMatrix=makeTranslation-rotatePointX,-rotatePointY; var rotationMatrix=makeRotationangleInRadians; var moveBackMatrix=makeTranslationrotatePointX,rotatePointY; //将矩阵相乘。 var矩阵=矩阵多点矩阵、旋转矩阵; 矩阵=矩阵MultiplyMatrix,moveBackMatrix; 矩阵=矩阵多重矩阵,投影矩阵; //设定矩阵。 gl.uniformMatrix3fvmatrixLocation,false,矩阵; //绘制几何图形。 gl.drawArraysgl.TRIANGLES,0,6; requestAnimationFramedrawScene; } 绘画场景; } 函数make2DProjectionwidth、height{ //注意:此矩阵翻转Y轴,因此0位于顶部。 返回[ 2/宽度,0,0, 0,-2/高度,0, -1, 1, 1 ]; } 函数makeTranslationtx,ty{ 返回[ 1, 0, 0, 0, 1, 0, 德克萨斯州,泰,1 ]; } 函数makeRotationangleInRadians{ var c=数学余角半径; var s=数学正弦半径; 返回[ c、 -s,0, s、 c,0, 0, 0, 1 ]; } 函数makescalex,sy{ 返回[ sx,0,0, 0,sy,0, 0, 0, 1 ]; } 函数矩阵multiplya,b{ var a00=a[0*3+0]; var a01=a[0*3+1]; var a02=a[0*3+2]; var a10=a[1*3+0]; var a11=a[1*3+1]; var a12=a[1*3+2]; var a20=a[2*3+0]; var a21=a[2*3+1]; var a22=a[2*3+2]; var b00=b[0*3+0]; var b01=b[0*3+1]; var b02=b[0*3+2]; 变量b10=b[1*3+0]; 变量b11=b[1*3+1]; 变量b12=b[1*3+2]; var b20=b[2*3+0]; var b21=b[2*3+1]; var b22=b[2*3+2]; 返回[a00*b00+a01*b10+a02*b20, a00*b01+a01*b11+a02*b21, a00*b02+a01*b12+a02*b22, a10*b00+a11*b10+a12*b20, a10*b01+a11*b11+a12*b21, a10*b02+a11*b12+a12*b22, a20*b00+a21*b10+a22*b20, a20*b01+a21*b11+a22*b21, a20*b02+a21*b12+a22*b22]; } //用构成rect的值填充缓冲区。 函数集GeometryGL{ 缓冲数据 gl.ARRAY\u缓冲区, 新浮点数组[ 10 , 30, 130, 30, 10, 150, 10, 150, 130, 30, 130, 150], gl.静态绘制; } 主要的 帆布{ 边框:1px纯黑; } 属性向量2 a_位置; 均匀mat3u_矩阵; 真空总管{ //将位置乘以矩阵。 gl_位置=vec4u_矩阵*vec3a_位置,1.xy,0,1; } 精密中泵浮子; 均匀的vec4 u_颜色; 真空总管{ gl_FragColor=u_颜色; }