Ray-Sphere交叉点

时间:2011-06-30 11:13:48

标签: c++ opengl

OpenGL中是否有任何Ray球体交互代码。我真的需要了解该程序,所以我正在寻找它,但找不到它。这似乎是流行的问题,但我只能找到公式和基本原理而不是任何一个例子。 http://wiki.cgsociety.org/index.php/Ray_Sphere_Intersection

我不知道如何去做。这就是我得到的:http://www.sendspace.com/file/8gb6fj

你们有没有人这样做过,或者知道我可以获得该计划的某些来源?

2 个答案:

答案 0 :(得分:34)

令:

  • A(xA,yA,zA)和B(xB,yB,zB)是线上的两个不同点
  • C(xC,yC,zC)是球体的中心
  • r是球体的半径

球体的笛卡尔方程是:

  • (X-X-C)2 +(Y-YC)2 +(Z-ZC)2 = R 2

让我们写出线的参数方程(参数d):

  • x = xA + d *(xB-xA)
  • y = yA + d *(yB-yA)
  • z = zA + d *(zB-zA)

球体方程中的替换产生:

  • (xA + d(xB-xA) - xC)²+(yA + d(yB-yA) - yC)²+(zA + d(zB-zA) - zC)²=r²

这是d中的二次方程式,其中的描述是:

  • 德尔塔=称b²-4 *一个* C

使用:

  • a =(xB-xA)²+(yB-yA)²+(zB-zA)²
  • b = 2 *((xB-xA)(xA-xC)+(yB-yA)(yA-yC)+(zB-zA)(zA-zC))
  • c =(xA-xC)²+(yA-yC)²+(zA-zC)²-r²

如果Delta <0则没有交叉点

如果Delta == 0则有一个交叉点(该线接触球体) 唯一的解决方案是d = -b / 2a(从那里使用参数方程来计算交点的坐标)

如果Delta> 0,则存在两个交叉点 解决方案是d1 =( - b-sqrt(Delta))/(2a)和d2 =( - b + sqrt(Delta))/(2a)(从那里使用参数方程计算交叉点的坐标)


所以你需要做的是:

  • 使用上面的公式计算a,b,c,然后计算Delta
  • 取决于其值,计算d或(d1和d2)
  • 如果有任何
  • ,则计算交叉点的坐标

答案 1 :(得分:3)

OpenGL是一个纯粹的绘图API,即整个设计旨在提供绘图工具。没有场景管理,几何工具等。必须通过其他方式提供。