Opengl 将三维对象向右/向左移动+;上/下独立于其旋转

Opengl 将三维对象向右/向左移动+;上/下独立于其旋转,opengl,3d,rotation,translation,opentk,Opengl,3d,Rotation,Translation,Opentk,目标: 移动三维对象,就像它在二维空间(屏幕)中一样。因此,如果用户向左移动鼠标,对象应该向左移动(这同样适用于所有其他方向:右、上、下) 说明: 我正在使用OpenTK(OpenGL-3D空间) 由于对象本身应该始终围绕其中心旋转,我首先应用旋转,然后应用平移矩阵 什么有效 通过尝试,我能够使x轴和y轴(均为二维空间)的平移分别工作 // works for x-Axis movement var rotation = _control.Rotation; // vector is a 2d

目标: 移动三维对象,就像它在二维空间(屏幕)中一样。因此,如果用户向左移动鼠标,对象应该向左移动(这同样适用于所有其他方向:右、上、下)

说明: 我正在使用OpenTK(OpenGL-3D空间) 由于对象本身应该始终围绕其中心旋转,我首先应用旋转,然后应用平移矩阵

什么有效 通过尝试,我能够使x轴和y轴(均为二维空间)的平移分别工作

// works for x-Axis movement
var rotation = _control.Rotation;

// vector is a 2d vector that contains the vector from the mouse drag start position 
// (so the pixels the mouse was moved from the drag start to its current position)
// factor is a value that depends on the current zoom value - can be ignored for the problem itself
var xTranslationVector = new Vector3(
            vector.X * (float)Math.Cos(rotation.Y) * factor, 
            0,
            vector.X * (float)Math.Sin(rotation.Y) * factor);

// initial value is the original translation on drag start
_control.Translation = initialValue + xTranslationVector;

// vector for y-Axis
var yTranslationVector = new Vector3(0,
            -vector.Y * (float) Math.Cos(rotation.X) * factor,
            vector.Y * (float) Math.Sin(rotation.X) * factor);

// _control.Translation = initialValue + yTranslationVector;
当使用时两者相互独立

问题

  • 我需要如何组合xTranslationVector和yTranslationVector,以使其按预期工作(乘法不起作用,因为任何向量分量都可能为0,这将导致根本不移动;当对象部分绕某个轴旋转时,加法不起作用)
  • 我想了解我在那里做什么,我应该寻找什么数学术语来寻找解释
  • 对于旋转,我该如何做同样的操作(例如,对象围绕y轴旋转45度,我想旋转-当前对象将围绕其x轴倾斜,但我希望始终将其倾斜,就像对象未围绕其x轴旋转一样-抱歉,不确定如何恰当地使用此词)

  • 我建议使用4x4矩阵进行转换。矩阵可以通过(乘法)
    *
    -运算符连接,并在顶点着色器中设置为
    mat4
    统一。使用变换矩阵变换顶点坐标
    gl_Position=transformMatrix*vertex
    。矩阵基于旋转和变换向量生成。API对此进行了抽象,所以您不需要处理它。哪个API?要进行灵活的变换,必须组合多个矩阵进行旋转和平移。据我所知,它只是一个C#OpenGL接口。我使用的api在OpenTK之上工作,可以让你简单地指定3d对象的旋转和平移。意思是:object.Position=新矢量3(x,y,z),object.Rotation=新矢量3(x,y,z)是您指定的。矩阵的工作是由内部api完成的,因此api似乎缺乏灵活性。我建议使用
    Matrix4
    计算模型转换。从最终转换矩阵中提取平移和平移。我建议使用4x4矩阵进行转换。矩阵可以通过(乘法)
    *
    -运算符连接,并在顶点着色器中设置为
    mat4
    统一。使用变换矩阵变换顶点坐标
    gl_Position=transformMatrix*vertex
    。矩阵基于旋转和变换向量生成。API对此进行了抽象,所以您不需要处理它。哪个API?要进行灵活的变换,必须组合多个矩阵进行旋转和平移。据我所知,它只是一个C#OpenGL接口。我使用的api在OpenTK之上工作,可以让你简单地指定3d对象的旋转和平移。意思是:object.Position=新矢量3(x,y,z),object.Rotation=新矢量3(x,y,z)是您指定的。矩阵的工作是由内部api完成的,因此api似乎缺乏灵活性。我建议使用
    Matrix4
    计算模型转换。从最终变换矩阵中提取平移和平移。