我在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();
}
}
以下是问题的屏幕截图。左边的行不应该出现!
我一直在研究这个问题几个小时,我没有尝试过。任何输入都会有很大的帮助。
PS。白线看起来是黑色的,因为我删除了光源和一切不必证明问题的东西。
答案 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坐标?这可能是导致问题的原因。