webGL:沿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的公式是什么,旋转角度θ围绕某一点 我搜索了老论坛,找到了一些相关信息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轴旋转。基本上是围绕向量旋转对象,需要平移并旋
我的问题是我能不能用这个等式。。因为它类似于绕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_颜色;
}