OpenGL - 围绕特定轴旋转平面?
OpenGL - Rotating a plane around a specific axis?
我正在旋转这些顶点的平面组合,
Vector3[] VertexPositionData = new Vector3[]{
new Vector3( 0f, 0f, 1f),
new Vector3( 1f, 0f, 1f),
new Vector3( 1f, 1f, 1f),
new Vector3( 0f, 1f, 1f)
};
在它的 y 轴上有:
Rotation.Y += (float)Math.PI / 4;
效果如上图。但我宁愿飞机绕着它的左边缘旋转,这样黄色就固定在红色上了。
模型矩阵按常规计算,
public Matrix4 GetModelMatrix()
{
return Matrix4.Scale(Scale) * Matrix4.CreateRotationX(Rotation.X) * Matrix4.CreateRotationY(Rotation.Y) * Matrix4.CreateRotationZ(Rotation.Z) * Matrix4.CreateTranslation(Position);
}
除了修改X和Z位置外,还有什么方法可以实现?
平面围绕其局部 Y 轴旋转,如果您希望平面围绕其左边缘旋转,则需要将其与 Y 轴对齐。在你的例子中,平面距离 Z 轴上的原点 1 个单位。
您可以像这样修改它的顶点:
Vector3[] VertexPositionData = new Vector3[]{
new Vector3( 0f, 0f, 0f),
new Vector3( 1f, 0f, 0f),
new Vector3( 1f, 1f, 0f),
new Vector3( 0f, 1f, 0f)
};
或者,您可以将它在 Z 轴上平移 1 个单位,这样它就会在原点 (0, 0, 0) 上对齐,如下所示:
Matrix4 result = Matrix4.Scale(Scale) * Matrix4.CreateTranslation(new Vector3(0, 0, -1)) * Matrix4.CreateRotationX(Rotation.X) * Matrix4.CreateRotationY(Rotation.Y) * Matrix4.CreateRotationZ(Rotation.Z) * Matrix4.CreateTranslation(Position);
我正在旋转这些顶点的平面组合,
Vector3[] VertexPositionData = new Vector3[]{
new Vector3( 0f, 0f, 1f),
new Vector3( 1f, 0f, 1f),
new Vector3( 1f, 1f, 1f),
new Vector3( 0f, 1f, 1f)
};
在它的 y 轴上有:
Rotation.Y += (float)Math.PI / 4;
效果如上图。但我宁愿飞机绕着它的左边缘旋转,这样黄色就固定在红色上了。
模型矩阵按常规计算,
public Matrix4 GetModelMatrix()
{
return Matrix4.Scale(Scale) * Matrix4.CreateRotationX(Rotation.X) * Matrix4.CreateRotationY(Rotation.Y) * Matrix4.CreateRotationZ(Rotation.Z) * Matrix4.CreateTranslation(Position);
}
除了修改X和Z位置外,还有什么方法可以实现?
平面围绕其局部 Y 轴旋转,如果您希望平面围绕其左边缘旋转,则需要将其与 Y 轴对齐。在你的例子中,平面距离 Z 轴上的原点 1 个单位。
您可以像这样修改它的顶点:
Vector3[] VertexPositionData = new Vector3[]{
new Vector3( 0f, 0f, 0f),
new Vector3( 1f, 0f, 0f),
new Vector3( 1f, 1f, 0f),
new Vector3( 0f, 1f, 0f)
};
或者,您可以将它在 Z 轴上平移 1 个单位,这样它就会在原点 (0, 0, 0) 上对齐,如下所示:
Matrix4 result = Matrix4.Scale(Scale) * Matrix4.CreateTranslation(new Vector3(0, 0, -1)) * Matrix4.CreateRotationX(Rotation.X) * Matrix4.CreateRotationY(Rotation.Y) * Matrix4.CreateRotationZ(Rotation.Z) * Matrix4.CreateTranslation(Position);