- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在构建一个基本的光线追踪算法,并且需要弄清楚哪种处理交点的系统在性能方面是最佳的。
在我检查光线和对象的交点的方法中,我返回一个结构,其中包含光线行进到命中的距离、命中的位置 vector 和法线 vector 或 -1没有交叉点时的距离。
对于下一步,我必须找到所有交叉点的最短距离并排除距离为负的那些。
我什至考虑过使用 2 个结构,一个只有负距离,一个完整的结构来减少所需的空间量,但我认为这不会真正产生影响。
到目前为止我的选择:首先遍历交叉点的数组并排除距离为负的那些,然后通过排序算法(由于实现速度快,可能是插入排序)找到与剩余部分的最短距离。
或者将它们放在一个算法中,如果距离为负,则在每个排序步骤中进行测试。
typedef Point3f float[3];
typedef struct {
float distance;
Point3f point;
Point3f normal;
} Intersection;
Intersection intersectObject (Ray-params, object) {
Intersection intersection;
//...
if (hit) {
intersection.distance = distance;
intersection.point = point;
intersection.normal = normal;
} else {
intersection.distance = -1.0f;
}
return intersection;
}
//loop over screen pixel
Intersection* intersections;
int amountIntersections;
//loop over all objects
//here I would handle the intersections
if (amountIntersections) {
//cast additional rays
}
我真的想不出什么是处理这个问题的最佳方法,因为它会被调用很多次。交点数组可能是一个动态数组,其中 amountIntersections 作为长度变量,或者是一个具有最大预期交点数量的数组,然后其中有负距离的交点。
最佳答案
这是我已成功用于大量对象的方法。 (特别是对于球棒原子模型;请参阅我的 Wikipedia user page 了解我用于这些的方程式。)
首先,将物体变换到以眼睛为原点的坐标系,投影平面平行于xy平面,中心在正z轴上。正如您从上面的链接页面中看到的那样,这大大简化了所需的方程式。
举个例子,如果你有一个单位射线n(所以n· b>n = 1) 和一个以 c 为中心的半径 r 的球体,光线与球体相交当且仅当 h ≥ 0,
h = (n·c)2 + r2 - (c·c)
如果是,在距离 d,
d = n·c ± sqrt(h)
如果您编写出必要的代码并使用合理的临时变量,您会发现您可以使用八次乘法和六次加法或减法拒绝非交叉球体,并且这可以使用 SSE2/AVX 内在函数轻松跨对象矢量化(#include <x86intrin.h>
)。 (也就是说,不要尝试对 n 或 c 使用 XMM/YMM vector 寄存器,而是将每个寄存器组件用于不同的对象,一次计算 2/4/8 个对象的 h。)
对于每条射线,根据已知的最小 z 坐标(例如,cz - < i>r 表示球体)。这样,当你在距离d处找到一个交点时,你可以忽略所有最小z坐标大于d的对象,因为交点必然更远,后面已知的十字路口。
同样,您应该忽略所有距离小于到投影平面的距离(即 zd/< i>nz,如果飞机在z = zd,并且每条射线只需要计算一次),因为这些交点位于眼睛和投影平面之间。 (从技术上讲,如果您将投影平面视为相机,那么您已经“撞上”了某物。)
关于c - 关于光线追踪算法相交测试性能的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54293926/
我正在开发一个网站,在不使用任何第三方 API 的情况下使用 Firebase 云消息传递(Chrome 和 Firefox 浏览器)向我的订阅者发送推送通知。推送通知发送工作正常,但我不知道“如何跟
我在尝试追踪此 OutOfMemoryError 时遇到了非常糟糕的时间,非常感谢您的帮助。我的应用程序分为架构部分和一个模块,该模块公开一些基本的 REST WS 以及 Hibernate 进行的数
在 Android 操作系统源代码中(路径:/drivers/staging/android/binder_trace.h),我们有一个名为 binder_trace.h 的文件,并且在 /drive
我正在查看我的 CakePHP 应用程序的 error.log,并看到我定期收到此类信息: 2011-07-28 14:49:39 Warning: Warning (2): Missing argu
我收到了有关我的应用程序中内存泄漏的报告,但我无法准确追踪到底发生了什么。我有一个功能可以取出旧 View 并交换新 View 。我没有使用 NavControllers 或任何 @propertie
这是真气! >_< 我编写了一个庞大而复杂的 Haskell 库。我写了一个小测试程序,到目前为止,我已经花了大约 8 个小时试图弄清楚为什么它一直在我身上崩溃。有时 GHC 会提示“奇怪的封闭类型”
是否有系统的方法来调试导致组件在 React 中重新渲染的原因?我放置了一个简单的 console.log() 来查看它渲染了多少次,但我很难弄清楚是什么导致组件渲染多次,即在我的情况下(4 次)。是
我已经升级到 Django 1.4,现在当我运行我的开发服务器时,我收到以下警告: /home/flc/venvs/myprj/lib/python2.6/site-packages/django/v
我有一个 Web 应用程序在某处存在内存泄漏,但我无法检测到它。我已经尝试过 Chrome 开发者工具,通常效果很好,但我无法追踪负责的代码行。 Chrome 工具给了我太多信息,我无法将内存中的对象
直接从标记调用函数的好处之一是更容易跟踪所调用的内容。我想知道是否有浏览器插件或其他东西支持附加(绑定(bind))到元素的每个事件的“Goto javascript 源函数”。理想情况下,这会将我带
我在工作中使用 darcs 已经一年多了,但我一直在问自己同样的问题: 跟踪导致两个补丁之间依赖的代码行/文件/代码更改的最佳方法是什么?目前我的做法如下: 我使用 darcs changes -i
我知道以前有人问过此类问题,但我无法解决我的疑问。我有一个简单的黑白棋引擎(实际上它玩得很好),它使用下面的类来获得最佳棋步: import java.util.*; import java.util
上下文:我们正在构建用于快速交付 WPF 应用程序的框架。该框架使用 Autofac 作为 IoC 容器,还使用 Prism v1 中的区域。我们正在使用 Microsoft 的并行扩展来安排任务
有什么追踪东西的技巧吗?技术?任何可用于检查函数 x 的调用者的工具(调用堆栈的某些部分显示为 ??? 或被跳过)。 --track-origins=yes 是否会使速度变慢(当我尝试这样做时,我使用
我有一个基于 KnockoutJS 2.2.1 创建的 jQuery 网格插件。到目前为止它进展顺利,但是当插件在一个元素上初始化时,'computed' loadGrid 方法调用 3 次。 为了说
我是这种开发的新手。我正在尝试创建一个涉及 GPS 跟踪的 android 应用程序。我正在使用 Nutiteq,因为我必须使用 openstreetmap 作为默认 map 。请帮助我。 最佳答案
我希望用户能够通过我的应用程序之一跟踪他们的 friend 。该应用程序适用于音乐节。 我一直在想办法做到这一点: 让用户为设备设置昵称(与 UDID 关联),并让用户通过昵称将彼此添加到“好友列表”
有没有办法找到所有者或域名示例,如果我给谷歌的IP,我的工具发现谷歌的IP,这应该以编程方式完成地址最喜欢的编程语言将是VC++其他语言也不是问题 最佳答案 您正在寻找的关键字似乎是WHOIS 通常可
我的 VC++ 项目中有几个包含大量类的 map ,其中一些默认可构造,另一些则不能。尝试构建时,出现“没有合适的默认构造函数可用”错误。问题是错误被列为发生在 map.cpp 的第 173 行,这是
我平均工作(约 20k 行代码,Objective-C 与 C++ 混合),我正在努力寻找 EXC_BAD_ACCESS 错误。 我已经尝试了所有常见的技术(比如启用 NSZombie、guard e
我是一名优秀的程序员,十分优秀!