C# 开放式TK射线投射/与零件相交

C# 开放式TK射线投射/与零件相交,c#,vb.net,opengl,opentk,raycasting,C#,Vb.net,Opengl,Opentk,Raycasting,我目前正在用OpenTK编写一个CAD类型查看器。我已经完成了大部分工作,包括加载文件、显示文件、适当的照明、旋转等等。我现在想弄清楚的是如何找出我在对象上单击的位置。我发现光线投射可能是我想要做的,但是我如何确定光线在哪里相交 我的部分是用法向量和每个三角形的三个点绘制的。我把我的环境设置为平滑,所以在绘制时,很多形状都是通过打开TK来近似的 如果我错了,请纠正我的错误,但我认为视图窗口可以被视为一个矩形圆柱体,通过对象进行切片,并且视图窗口上的点可以简单地沿着相同的角度进入零件: 如果这是

我目前正在用OpenTK编写一个CAD类型查看器。我已经完成了大部分工作,包括加载文件、显示文件、适当的照明、旋转等等。我现在想弄清楚的是如何找出我在对象上单击的位置。我发现光线投射可能是我想要做的,但是我如何确定光线在哪里相交

我的部分是用法向量和每个三角形的三个点绘制的。我把我的环境设置为平滑,所以在绘制时,很多形状都是通过打开TK来近似的

如果我错了,请纠正我的错误,但我认为视图窗口可以被视为一个矩形圆柱体,通过对象进行切片,并且视图窗口上的点可以简单地沿着相同的角度进入零件:

如果这是正确的,那么建立光线应该相对容易,但是我的问题仍然存在,如何判断光线与我的部分相交?我试图得到这个交叉点的实际坐标(x,y,z)。我最终将使用此方法将相机的焦点设置为单击的点,以便在新点作为焦点时发生旋转等情况

任何帮助都将不胜感激,任何解决方案都可以在VB.NET或C#中使用


谢谢

“viewbox”仅在使用正交投影时有效,使用透视投影时必须使用棱锥体,并且光线的构造不太直接。假设有一个正交投影,接下来需要做的就是找到直线和曲面之间的碰撞点。如果此曲面由三角形组成,则需要一个光线三角形交点。比我聪明的人一直在思考如何快速完成任务,所以你最好用谷歌搜索一下。如果曲面不是由三角形组成的,则必须对曲面类型进行自定义处理。因此,没有open gl/open tk函数来检测与对象的碰撞?另外,如果我的视图更像一个金字塔,那么我将如何建立我的光线呢?这会是一个不同的角度比我的相机有一个焦点吗?Opengl没有这样的东西,虽然我认为GLUT有一些辅助功能,使它更容易。这种技术被称为“挑选”,我认为openTK对它有支持,所以谷歌同意。是的,如果你的鼠标不在屏幕的正中央,角度会不同于焦点。我该如何确定新的角度呢?好吧,你最好用谷歌搜索并获取一个预先制作的openTK函数,但它的工作原理是这样的。获取视图投影矩阵的倒数,并使用它生成两个点:一个用于近平面上的鼠标位置,另一个用于远平面上的鼠标位置。那么这两点之间的线就是你应该测试碰撞的线。