您如何在OpenGL中实现形状的旋转以及旋转状态下的运动?

时间:2018-11-23 07:51:05

标签: opengl rotation move translate coordinate-transformation

如何实现形状的原位旋转和旋转状态下的运动? 我想将旋转的形状移向看到的屏幕的x和y轴。

按键时,形状已经沿x轴和y轴方向移动。 但是我无法按照自己的意愿前进。有点奇怪。 如何设置代码以改变我想要的方式? 我现在将代码放起来。

Sub h100_monthyear_ALTERNATIVE()
    Dim rs As Worksheet
    For Each rs In Worksheets
        If rs.Name = "x01st" Or rs.Name = "x02nd" Or rs.Name = "x03rd" Or _
           (rs.Name Like "x??th" And Val(Mid(rs.Name, 2, 2)) >= 4 And Val(Mid(rs.Name, 2, 2)) <= 31) Then
            rs.Name = rs.Range("h100")
        End If
    Next rs
End Sub

我编写了代码以使其旋转到位。

代码顶部和底部的代码是移动到形状中心然后将其返回到其位置的代码。

我应该添加什么? 应该修改哪一部分?

我英语不好。 我很抱歉 你能帮我吗?

1 个答案:

答案 0 :(得分:2)

请注意,数十年来,不赞成使用glBegin / glEnd序列(固定功能管线矩阵堆栈)进行绘制。 阅读有关Fixed Function Pipeline的信息,并参阅Vertex SpecificationShader了解最新的渲染方式。


  

如何在适当位置实现形状旋转?

如果阴影应绕其局部轴旋转,则必须在平移之前进行旋转。在代码中,这意味着旋转指令必须在翻译指令之后:

glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glRotatef(100, 0.0, 0.0, 1.0);

另请参阅OpenGL translation before and after a rotation


说明:

翻译:请参见glTranslate的文档:

  

glTranslate产生x y z的翻译。当前矩阵(请参见glMatrixMode)与此转换矩阵相乘,乘积代替当前矩阵。

轮换:请参见glRotate的文档:

  

glRotate围绕向量x y z产生角度度旋转。当前矩阵(请参见glMatrixMode)与旋转矩阵相乘,乘积替换当前矩阵。


翻译矩阵如下所示:

Matrix4x4 translate;

translate[0] : ( 1,  0,  0,  0 )
translate[1] : ( 0,  1,  0,  0 )
translate[2] : ( 0,  0,  1,  0 )
translate[3] : ( tx, ty, tz, 1 )

围绕Z轴的旋转矩阵如下:

Matrix4x4  rotate;
float      angle;

rotate[0] : ( cos(angle),  sin(angle), 0, 0 )
rotate[1] : ( -sin(angle), cos(angle), 0, 0 )
rotate[2] : ( 0,           0,          1, 0 )
rotate[3] : ( 0,           0,          0, 1 )   


translate * rotate的结果是这样的:

glTranslate( ..... );
glRotate( ..... );

model[0] : ( cos(angle),  sin(angle), 0,  0 )
model[1] : ( -sin(angle), cos(angle), 0,  0 )
model[2] : ( 0,           1,          0,  0 )
model[3] : ( tx,          ty,         tz, 1 )


rotate * translate的结果是:

glRotate( ..... );
glTranslate( ..... );

model[0] : ( cos(angle),                     sin(angle),                     0,  0 )
model[1] : ( -sin(angle),                    cos(angle),                     0,  0 )
model[2] : ( 0,                              0,                              1,  0 )
model[3] : ( cos(angle)*tx - sin(angle)*tx,  sin(angle)*ty + cos(angle)*ty,  tz, 1 )