问题标签 [raytracing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 透视投影与光线追踪/光线投射的效率
我有一个非常笼统的问题。我希望确定多个对象的边界点(包括 30-50 个封闭多边形 (z),每个具有大约 300 个点 (x,y,z))。我正在使用一个固定的视口,它围绕多边形坐标系的 x、y 和 z 轴(alpha、beta、gamma)旋转。
在我看来,有两种可能性:透视投影或光线追踪。透视投影似乎需要对每个点进行大量矩阵运算来确定其位置是否在视口内。或者考虑到大量的点,我会更好地将视口像素光线追踪到对象吗?即确定是否存在交叉点,然后确定交叉点是否发生在对象内或对象外。无论哪种情况,我都会将此结果写为 0(外部)或 1(内部)到 200x200 表示视口的整数矩阵
谢谢你的期待
java - 如何在给定任意相机的情况下投射光线?
我正在写一个光线追踪器(使用左手坐标,如果有区别的话)。这是为了自学原理,所以我还没有使用 OpenGL 或像景深这样的复杂功能。我的相机可以有任意的位置和方向;我通过三个向量 、 和 来表示它们location
,look_at
它们的sky
行为类似于等效的 POV-Ray 向量。它的“电影”也有一个width
和height
。(长度隐含从到focal
的距离。)position
look_at
我的问题是不知道如何投射光线。我有两个量vx
和vy
,它们指示射线应该在哪里结束。它们都在-1到1之间变化。如果它们都是-1,我将光线从相机的位置投射到“电影”的左上角;如果它们都是 1,则右下角;如果它们都是 0,则为中心;其余的很明显。
我对矢量算术不够熟悉,无法推导出射线的方程。我将不胜感激如何做到这一点的解释。
math - 如何将射线平面交点转换为重心坐标?
我的问题:
如何获取两个 3D 点并将它们锁定到一个轴?例如,使它们的 z 轴都为 0。
我正在尝试做的事情:
我在一个场景中有一组 3D 坐标,代表一个带有金字塔的盒子。我还有一个相机,由另一个 3D 坐标表示。我从场景坐标中减去相机坐标并对其进行归一化,返回一个指向相机的向量。然后我与相机点后面的平面进行射线平面相交。
其中 O(原点)是相机位置,D 是从场景点到相机的方向,t 是光线从相机点与平面相交所需的时间。
如果这没有意义,这里是一个粗略的绘图:
我进行了广泛搜索,据我所知,这被称为使用“针孔相机”。
问题不在于我的相机旋转,我已经消除了它。问题在于将交点转换为重心 (uv) 坐标。
x 轴上的平移如下所示:
而 z 轴上的平移看起来像这样:
我的问题是:如何将射线平面交点转换为 x 轴和 z 轴上的重心坐标?
filtering - 光线追踪中的纹理缩小过滤器?
有人可以指出我的论文/算法/资源/告诉我如何在光线跟踪器中实现纹理缩小过滤器(当纹素小于像素时适用)?
谢谢!
tree - KD-Tree 遍历(光线追踪)——我错过了一个案例吗?
我正在尝试在我的光线追踪器中遍历 3D KD-Tree。树是正确的,但是我的遍历算法似乎有问题,因为与使用蛮力方法相比,我遇到了一些错误(一些小的表面区域似乎被忽略了)。
注意:所讨论的光线均不平行于任何轴。
这是我的遍历算法:
我创建了一个包含所有不同情况的图形:
(来源:cycovery.com)
我错过了一个案例吗?
感谢您的帮助!
raytracing - 光线追踪阴影问题
我的光线追踪器中的阴影光线有问题。
请看下面两张图片
3D 最大:
替代文字 http://neo.cycovery.com/shadow_problem.gif
我的光线追踪器:
替代文字 http://neo.cycovery.com/shadow_problem2.jpg
场景被非常明亮的灯光照亮,从后面发光。它太亮了,阴影中没有渐变,只有白色或深色(由于过度曝光)。
两个图像都是使用 3DStudioMax 渲染的,并且都使用完全相同的几何图形,只是在一种情况下,法线是在三角形上插值的。
现在考虑表面上的红点。在未平滑版本的情况下,它位于黑暗区域。这意味着从这个三角形看不到光源,因为它背对着它。然而,在平滑版本中,它位于光照区域,因为插值法线表明,光线在该点可见(尽管三角形的实际几何图形背对光源)。
我现在的问题是当光线跟踪阴影进入时。如果从红点将阴影光线射入场景,以测试光源是否可见(以确定阴影),阴影光线将返回一个相交,与法线是否被插值(因为交点只取决于几何)。因此,像素会变暗。
3dsamx 正在正确处理这种情况 - 渲染图像是在打开光线跟踪阴影的情况下生成的。然而,当我打开光线追踪阴影时,我自己的光线追踪器恰好遇到了这个问题(在我的光线追踪器中,这两种情况下的点都是黑暗的,因为光线追踪阴影决定了位于阴影中的点),我不知道如何解决它。
我希望有人知道这个问题以及如何处理它..
谢谢!
opengl - OpenGL gluUnProject 对象部分
我正在使用 gluUnProject 将光线投射到场景中并在那里添加一个图元。我现在要做的是准确地选择现有的基元,所以如果我有 3 个球体,我可以点击一个来删除它。
我认为解决方案会以某种方式检查光线是否与物体相交并检查它是否最接近投射原点。到目前为止,我的解决方案是原始的,并用一个边界立方体包围所有对象,无论如何,是否可以简单地使用以下方法为球体准确地执行此操作:
或者
最后一件事,我使用 OpenGL 和 GLUT。
谢谢大家,劳伦斯
geometry - 如何为射线/球体相交建立二次方程?
我正在研究光线追踪器的数学,但我并没有遵循我读过的关于该主题的几乎每篇文章中的过渡。这就是我所拥有的:
球体公式:
(X - Cx)^2 + (Y - Cy)^2 + (Z - Cz)^2 - R^2 = 0
其中R为半径,C为圆心,X、Y、Z为球面内的所有点。
线的公式:
X + DxT,Y + DyT,Z + DzT
其中 D 是直线的归一化方向向量,X、Y、Z 是直线上的所有点,T 是直线上某个点的参数。
通过将直线的分量代入球面方程,我们得到:
(X + DxT - Cx)^2 + (Y + DyT - Cy)^2 + (Z + DzT - Cz)^2 - R^2 = 0
我一直追随到那一点(至少我认为我这样做),但是我读过的每一个教程都会从那个跳到一个二次方程而没有解释它(这是从其中一个站点复制的,所以术语是和我的例子有点不同):
A = Xd^2 + Yd^2 + Zd^2
B = 2 * (Xd * (X0 - Xc) + Yd * (Y0 - Yc) + Zd * (Z0 - Zc))
C = (X0 - Xc)^2 + (Y0 - Yc)^2 + (Z0 - Zc)^2 - Sr^2
我知道如何使用二次公式求解 T,但我不明白他们如何从上述公式中得到二次方程。我假设这只是我早已忘记的一些常见数学知识,但谷歌搜索“如何建立二次方程”也没有真正产生任何结果。
在继续之前,我真的很想了解如何到达这一步,因为我不喜欢编写我没有完全掌握的代码。
performance - 索取有关快速光线追踪算法的资源
首先,我很抱歉这个粗略的问题,但我不想介绍太多细节,所以我只是要求相关资源,如文章、库或提示。
我的程序需要对射线与三角形的交点进行密集计算(有数百万条射线和三角形),我的目标是尽可能快地完成。
我所做的是:
使用我知道的最快的射线三角形算法。
使用八叉树。(来自 Game Programming Gem 1, 4.10. 4.11)
使用八叉树算法中使用的高效且鲁棒的 Ray-Box 相交算法。
它比我应用那些更好的算法之前更快,但我相信它可能会更快,你能说明一下任何可能使它更快的地方吗?
谢谢。
algorithm - 测试线段是否与球体相交
我正在尝试确定线段(即两点之间)是否与球体相交。我对交叉点的位置不感兴趣,只关心线段是否与球面相交。有人对最有效的算法有什么建议吗?(我想知道是否有比通常的射线球相交算法更简单的算法,因为我对相交位置不感兴趣)