【问题标题】:Ray-Sphere intersection [closed]Ray-Sphere 交点 [关闭]
【发布时间】:2013-09-05 04:20:50
【问题描述】:

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

我不知道该怎么做。这是我得到的:http://www.sendspace.com/file/8gb6fj

你们有没有人做过或者知道我可以从哪里得到这个程序的一些来源?

【问题讨论】:

  • 公式就是你所需要的......该页面上还有一个 C++ 示例。
  • 这是一道数学题,除非您想通过 OpenGL 可视化查看可行的解决方案?
  • 反对票是怎么回事?其他库提供交叉测试,他要求以任何一种方式举例。这不是一个纯粹的数学问题(我们从什么时候开始关心这个问题)?
  • @David:他提供的链接有公式、证明和示例代码。

标签: c++ opengl


【解决方案1】:

让:

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

球体的笛卡尔方程为:

  • (x-xC)²+(y-yC)²+(z-zC)²=r²

让我们写出直线的参数方程(参数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中的一个二次方程,其中判别式为:

  • Delta=b²-4*a*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

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

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


所以你要做的是:

  • 使用上述公式计算 a、b、c 和 Delta
  • 根据其值,计算 d 或(d1 和 d2)
  • 如果有的话,计算交点的坐标

【讨论】:

  • “球体光线”到底是什么意思?
  • 对不起,我的意思是半径...已编辑!
  • 感谢您的回复,我会看看我能做些什么。顺便说一句,我在互联网上找到了这个,但不知道如何使用,因为它是 java。我得到了netbeans,有人知道我如何运行这个程序。看来这也是一些射线球相交程序:pixelnerve.com/v/2009/02/08/ray-sphere-intersection
  • 该死,评论或代码中不允许换行:因为你只想知道天气射线命中,这可以更加简化。这是我的 hlsl 代码 float intersectRaySphere(float4 rayOrigin, float4 rayDirection, float4 sphere) { float4 sphereCenter = sphere; sphereCenter.w = 1.0f; float4 dist = rayOrigin - sphereCenter;浮动 B_half = dot(dist, rayDirection);浮动 C = dot(dist, dist) - sphere.w;返回 B_half * B_half - C; } vector4s 的 w 分量在位置坐标上为 1,在球体的法线方向和平方半径上为 0。结果高于零意味着命中:D
  • 如果A或B中有负坐标,它会显示奇怪的功能。有什么建议吗?
【解决方案2】:

OpenGL 是一个纯绘图 API,即整个东西都是为了提供绘图工具而设计的。没有场景管理、几何工具等。这些必须通过其他方式提供。

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多