各种z值上的OpentTK + Glu.UnProject()不会给出重叠点

时间:2011-12-06 02:50:14

标签: c# .net opengl opentk glu

我在C#中使用OpenTK,过去几个小时我一直在打墙。

我正在尝试使用Glu.UnProject()通过用户单击的Universe创建光线。它跟踪的光线对于用户来说应该是不可见的,因为它是垂直于投影平面的线。

问题是当我使用基本相机位置时光线是不可见的。如果我移动相机(cameraX和cameraY),DrawLine中的线将显示在UI中。近点和远点与相机的“眼睛”不共线!

我在此处隔离了问题代码:

glSurface_Paint(Object sender, PaintEventArgs e) {
  double time = stopwatch.ElapsedMilliseconds * TimeScale + stopwatchOffset;

  GL.MatrixMode(MatrixMode.Projection);
  GL.LoadIdentity();

  Glu.Perspective(10, (double)Width / Height, nearClip, farClip);

  GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
  GL.MatrixMode(MatrixMode.Modelview);
  GL.LoadIdentity();
  Glu.LookAt(cameraX, cameraY, cameraZ * scaleFactor, 0, 0, 0, 0, 1, 0);
  GL.ClearColor(Color.DarkGray);

  if (ShowGrid) {
    DrawGrid();
  }

  DrawLine();

  glSurface.SwapBuffers();
}

这是DrawLine。它使用硬编码值取消投影近似(z = 0)和远(z = 1)平面的(100,200)点。然后简单地在这两点之间画一条线。

public void DrawLine() {
  int[] viewport = new int[4];
  double[] modelMatrix = new double[16];
  double[] projMatrix = new double[16];

  GL.GetInteger(GetPName.Viewport, viewport);
  GL.GetDouble(GetPName.ModelviewMatrix, modelMatrix);
  GL.GetDouble(GetPName.ProjectionMatrix, projMatrix);

  Vector3 clickNearPoint;
  Glu.UnProject(new Vector3(100, 200, 0), modelMatrix, projMatrix, viewport, out clickNearPoint);

  Vector3 clickFarPoint;
  Glu.UnProject(new Vector3(100, 200, 1), modelMatrix, projMatrix, viewport, out clickFarPoint);

  nearPoint = new Point3D(clickNearPoint.X, -clickNearPoint.Y, clickNearPoint.Z);
  farPoint = new Point3D(clickFarPoint.X, -clickFarPoint.Y, clickFarPoint.Z);

  if (nearPoint.HasValue && farPoint.HasValue) {
    GL.Color3(Color.White);

    GL.Begin(BeginMode.Lines);
    GL.Vertex3(nearPoint.Value.X, nearPoint.Value.Y, nearPoint.Value.Z);
    GL.Vertex3(farPoint.Value.X, farPoint.Value.Y, farPoint.Value.Z);
    GL.End();
  }
}

以下是问题的屏幕截图。左边的行不应该出现!

enter image description here

我一直在研究这个问题几个小时,我没有尝试过。任何输入都会有很大的帮助。

PS。白线看起来是黑色的,因为我删除了光源和一切不必证明问题的东西。

1 个答案:

答案 0 :(得分:1)

Vector3 clickNearPoint;
  Glu.UnProject(new Vector3(100, 200, 0), modelMatrix, projMatrix, viewport, out clickNearPoint);

  Vector3 clickFarPoint;
  Glu.UnProject(new Vector3(100, 200, 1), modelMatrix, projMatrix, viewport, out clickFarPoint);

  nearPoint = new Point3D(clickNearPoint.X, -clickNearPoint.Y, clickNearPoint.Z);
  farPoint  = new Point3D(clickFarPoint.X,  -clickFarPoint.Y,  clickFarPoint.Z);
                                            ^
                                            ^

为什么要否定返回的Y坐标?这可能是导致问题的原因。