Opengl 将三维对象向右/向左移动+;上/下独立于其旋转
目标: 移动三维对象,就像它在二维空间(屏幕)中一样。因此,如果用户向左移动鼠标,对象应该向左移动(这同样适用于所有其他方向:右、上、下) 说明: 我正在使用OpenTK(OpenGL-3D空间) 由于对象本身应该始终围绕其中心旋转,我首先应用旋转,然后应用平移矩阵 什么有效 通过尝试,我能够使x轴和y轴(均为二维空间)的平移分别工作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
// 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;
当使用时两者相互独立
问题
我建议使用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
计算模型转换。从最终变换矩阵中提取平移和平移。