我正在尝试在C#中使用OpenTK实现一些东西,当你渲染一个3d绘图时,你可以在我移动鼠标时围绕z轴(向上)旋转它。 我已经有了它的工作但是如下所示,我不得不想出一个任意常数500; 等式是:
arc_length = radius * theta
theta = arc_length / radius
其中radius = eye_pos.Length
arc_length是模型坐标中的delta_x,但是 (e.X - mouse_down_pos.X)处于屏幕坐标。 因此500用于将模型坐标映射到屏幕投影坐标。
问题:有没有办法消除这个常数并正确获得转换因子?
我有根据的猜测是,我应该以某种方式使用[delta_x,0,0]乘以投影矩阵的倒数...但是不知道如何。
private static Vector3 eye_pos = new Vector3(30.0f, 0.0f, 0.0f);
GL.MatrixMode(MatrixMode.Modelview);
Matrix4 lookat = Matrix4.LookAt(eye_pos.X, eye_pos.Y, eye_pos.Z, 0, 0, 0, 0, 0, 1);
...
private void glControl1_MouseMove(object sender, MouseEventArgs e)
{
if (mouse_op == Mouse_Operation.Rotate)
{
decimal yaw = (decimal)MathHelper.DegreesToRadians((e.X - mouse_down_pos.X) * 500 / eye_pos.Length) + ref_yaw;
SetYawAndRedraw(yaw);
}
}