Ray-Sphere交叉点

noo*_*oob 0 c++ opengl

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

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

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

Sté*_*ane 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)
  • 计算交叉点的坐标(如果有的话)