c#的图像平移和旋转

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#的图像平移和旋转相关的知识,希望对你有一定的参考价值。

我想问一下,c#的图像平移和旋转应该怎么做?要求不能使用类似于RotateTransform()的方法

参考技术A 你用的是什么 WinForm 还是 WPF

WPF 就非常的好弄!追问

我用的是WinForm,那用WinForm应该怎么做呢?求解

旋转图像后,平移矢量倾斜

【中文标题】旋转图像后,平移矢量倾斜【英文标题】:After rotating image the translation vector is skewed 【发布时间】:2016-04-11 02:01:18 【问题描述】:

我正在尝试在旋转图像后更正模型的平移和旋转行为。这似乎是一个普遍的问题。我以前见过这个问题,但我没有看到它以我理解如何将它应用于我的代码的方式回答。我只是希望平移和旋转行为在旋转图像之前保持不变。第一次旋转后,平移和旋转永远倾斜。另外,我对 OpenGL 非常熟悉,所以请慢慢说。

Private Sub GlControl1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles GlControl1.MouseMove
    If _MouseButtonLeft Then
        '
        ' get new position of mouse
        _XposEnd = e.X - _Xpos
        _YposEnd = _Ypos - e.Y
        '
        ' reset the mouse start position
        _Xpos = e.X
        _Ypos = e.Y
        '
        ' change projection
        GL.MatrixMode(MatrixMode.Projection)
        GL.Translate(_XposEnd * _MouseSpeed, _YposEnd * _MouseSpeed, 0)
        GlControl1.Invalidate()
        '
    End If
    '
    If _MouseButtonRight Then
        '
        ' get new position of mouse
        _XposEnd = e.X - _Xpos
        _YposEnd = _Ypos - e.Y
        '
        ' reset the mouse start position
        _Xpos = e.X
        _Ypos = e.Y
        '
        ' change projection
        GL.MatrixMode(MatrixMode.Projection)
        GL.Rotate(_XposEnd * _MouseSpeed, 1, 0, 0)
        GL.Rotate(_YposEnd * _MouseSpeed, 0, 1, 0)
        GlControl1.Invalidate()
        '
    End If
End Sub

编辑 1:

我的绘制循环是:

    GL.Clear(ClearBufferMask.ColorBufferBit)
    GL.Clear(ClearBufferMask.DepthBufferBit)
    GL.MatrixMode(MatrixMode.Modelview)
    GL.LoadIdentity()
    drawStuff()
    GlControl1.SwapBuffers()

投影矩阵:让我后退一秒。我正在绘制一个在 3D 空间 [Vertex3] 中有数千个顶点的 CAD 模型。我正在二维空间 [Ortho] 中查看它们。我修改投影矩阵以从不同的角度查看模型。我认为这比重新绘制整个模型并转换所有顶点要容易。在我看来,移动相机比重新计算数千个顶点的位置更容易。我认为这是标准的。如果没有,我会全力以赴。

【问题讨论】:

嘿,你在绘图循环中的任何地方都使用 glLoadIdentity 吗?我假设您不这样做,因为您希望 glRotate 堆叠。如果这是问题,我会详细说明。另外,我觉得你想修改你的投影矩阵很奇怪,你能解释一下吗? 【参考方案1】:

从您的代码中,我无法准确判断您期望什么行为,但我怀疑您正在尝试不断读取鼠标输入并增强“相机”。

在 GL 版本中,您使用的模型和视图矩阵被合并到 ModelView 矩阵中。这(在我看来)让事情在开始时更难理解。

如果将它们分开,您可以分别使用模型矩阵和视图矩阵单独转换对象和相机。由于它们是组合在一起的,因此您需要在进行视图转换之前“保存” ModelView 矩阵的状态。

这就是glPushMatrixglPopMatrix 派上用场的地方。

想想典型的stack。通过一个新矩阵到堆栈上,您继承了下面的所有内容(矩阵的当前状态),但随后的转换将被隔离到这个新矩阵。一旦您进行了转换并使用了矩阵(例如渲染),您就可以 pop 将该矩阵从堆栈中返回,这将使您返回到原始矩阵(包含您的模型转换)。您将在每次程序循环时执行此操作。

我已经很长时间没有编写过 VB.NET 或固定功能(前 GL3)代码了,请耐心等待:

GL.MatrixMode(MatrixMode.ModelView)
GL.PushMatrix()
GL.Rotate(viewXRotation, 1, 0, 0)
GL.Rotate(viewYRotation, 0, 1, 0)
GL.Rotate(viewZRotation, 0, 0, 1)
... draw your scene ...
GL.PopMatrix()

由于我看到您使用Projection 矩阵,这里有一些关于这两个矩阵及其交互方式的额外信息。

Projection 矩阵用于将视图坐标(这是应用 ModelView 矩阵时转换成的局部坐标)转换为剪辑坐标(标准化设备坐标)。

这是来自learnopengl.com的插图:

【讨论】:

以上是关于c#的图像平移和旋转的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 固定功能旋转和平移 2D 图像

应用OpenCV进行图像旋转和平移

图片处理-opencv-3.图像缩放、旋转、翻转、平移

Python图像处理丨图像缩放旋转翻转与图像平移

从 OpenCV 中的旋转矩阵和平移向量中获取旋转轴

图像旋转平移缩放变换矩阵计算及案例