围绕其坐标旋转对象
rotate object around its coordinates
如果我想将对象围绕其局部坐标旋转到世界(全局)坐标中。从理论上讲:我需要将其转换为 (0,0) 全局坐标,然后旋转并将其转换回其全局坐标。
但是如果对象已经在 (0,0) 全局坐标上呢?那我就不用翻译了。但是出了点问题。
这是立方体的顶点和索引:
export const cubeIndices = [
0, 1, 2,
0, 2, 3,
4, 5, 6,
4, 6, 7,
5, 0, 3,
5, 3, 6,
1, 4, 7,
1, 7, 2,
5, 4, 1,
5, 1, 0,
3, 2, 7,
3, 7, 6,
]
export const cubeData = [
-0.5 ,-0.5, 1.0,
0.5, -0.5, 1.0,
0.5 ,0.5 ,1.0,
-0.5, 0.5 ,1.0,
0.5, -0.5 ,0.0,
-0.5, -0.5, 0.0,
-0.5, 0.5 ,0.0,
0.5, 0.5,0.0,
]
没有任何转换对象渲染没有问题。
我想围绕它的 Y 轴旋转它。我绘制函数的下一步是:
mat4.rotateY(shape.transformMatrix,shape.transformMatrix,0.01)
但是得到了:
我做错了什么?
立方体的中心不是(0, 0, 0),而是(0, 0, 0.5)。当您绕立方体绕 y 轴旋转时,它会绕世界中心旋转,即 (0, 0, 0)。
如果你想围绕平行于世界 y 轴的对称轴旋转立方体,那么你必须选择。
将z坐标从0和1分别改为-0.5 0.5,使立方体的对称轴在世界中心:
export const cubeData = [
-0.5, -0.5, 0.5,
0.5, -0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, 0.5, 0.5,
0.5, -0.5, -0.5,
-0.5, -0.5, -0.5,
-0.5, 0.5, -0.5,
0.5, 0.5, -0.5,
]
当然这也可以通过翻译矩阵来完成。创建一个单独的旋转矩阵和平移矩阵。平移必须首先应用于顶点并且必须执行相同的操作,就好像您手动将每个顶点的 z 分量更改为 -0.5。
旋转矩阵必须由单位矩阵初始化:
mat4.identity(rotationMat);
平移矩阵必须包含沿 z 轴 (-0.5) 的平移:
var translation = vec3.create();
vec3.set(translation, 0, 0, -0.5);
mat4.identity(translateMat);
mat4.translate(translateMat, translateMat, translation);
平移矩阵和旋转矩阵必须连接(相乘)。请注意,您必须遵守转换的顺序。先平移模型再旋转模型。
由于旋转矩阵是分离的,所以可以连续变化:
mat4.rotateY(rotationMat,rotationMat,0.01)
mat4.multiply(shape.transformMatrix, rotationMat, translateMat)
如果我想将对象围绕其局部坐标旋转到世界(全局)坐标中。从理论上讲:我需要将其转换为 (0,0) 全局坐标,然后旋转并将其转换回其全局坐标。
但是如果对象已经在 (0,0) 全局坐标上呢?那我就不用翻译了。但是出了点问题。
这是立方体的顶点和索引:
export const cubeIndices = [
0, 1, 2,
0, 2, 3,
4, 5, 6,
4, 6, 7,
5, 0, 3,
5, 3, 6,
1, 4, 7,
1, 7, 2,
5, 4, 1,
5, 1, 0,
3, 2, 7,
3, 7, 6,
]
export const cubeData = [
-0.5 ,-0.5, 1.0,
0.5, -0.5, 1.0,
0.5 ,0.5 ,1.0,
-0.5, 0.5 ,1.0,
0.5, -0.5 ,0.0,
-0.5, -0.5, 0.0,
-0.5, 0.5 ,0.0,
0.5, 0.5,0.0,
]
没有任何转换对象渲染没有问题。
我想围绕它的 Y 轴旋转它。我绘制函数的下一步是:
mat4.rotateY(shape.transformMatrix,shape.transformMatrix,0.01)
但是得到了:
我做错了什么?
立方体的中心不是(0, 0, 0),而是(0, 0, 0.5)。当您绕立方体绕 y 轴旋转时,它会绕世界中心旋转,即 (0, 0, 0)。 如果你想围绕平行于世界 y 轴的对称轴旋转立方体,那么你必须选择。
将z坐标从0和1分别改为-0.5 0.5,使立方体的对称轴在世界中心:
export const cubeData = [
-0.5, -0.5, 0.5,
0.5, -0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, 0.5, 0.5,
0.5, -0.5, -0.5,
-0.5, -0.5, -0.5,
-0.5, 0.5, -0.5,
0.5, 0.5, -0.5,
]
当然这也可以通过翻译矩阵来完成。创建一个单独的旋转矩阵和平移矩阵。平移必须首先应用于顶点并且必须执行相同的操作,就好像您手动将每个顶点的 z 分量更改为 -0.5。
旋转矩阵必须由单位矩阵初始化:
mat4.identity(rotationMat);
平移矩阵必须包含沿 z 轴 (-0.5) 的平移:
var translation = vec3.create();
vec3.set(translation, 0, 0, -0.5);
mat4.identity(translateMat);
mat4.translate(translateMat, translateMat, translation);
平移矩阵和旋转矩阵必须连接(相乘)。请注意,您必须遵守转换的顺序。先平移模型再旋转模型。
由于旋转矩阵是分离的,所以可以连续变化:
mat4.rotateY(rotationMat,rotationMat,0.01)
mat4.multiply(shape.transformMatrix, rotationMat, translateMat)