我正在寻找一种良好的光线八叉树交叉算法,它以迭代的方式为我提供了光线穿过的叶子.我打算在CPU上实现它,因为我还不想潜入CUDA :)
目前,我的Voxel raycaster只在XxYxZ体素的非分层阵列上执行3D DDA(Amanatides/Woo版本).你可以想象,当有很多空的空间时,这是非常昂贵的,如下图所示(更亮的红色=更多的工作:) :):
我已经发现这个任务有两种算法:自下而上,从叶子向上运行,自上而下,这是基本的深度优先搜索.
我已经从2000年发现了Revelles的算法,称为八元遍历的高效参数算法,看起来很有趣,但是很老了.这是一种自上而下的算法.
最流行的自下而上的方法似乎是K. Sung,用于光线跟踪的DDA八叉树遍历算法,Eurographics'91,North Holland-Elsevier,ISBN 0444 89096 3,p.73-85.问题是大多数DDA八叉树遍历算法都期望八叉树具有相同的深度,这是我不想要的 - 空子树应该只是一个空指针或类似的东西.
在最近关于Sparse Voxel Octrees的文献中,我已经设法通读了(最值得注意的是Laine在SVO上的工作,它们似乎都基于某种GPU实现的DDA版本(Amanatides/Woo风格).
现在,这是我的问题:有没有人有任何实现基本的,没有多余的Ray-octree交叉算法的经验?你会推荐什么?
我一直在搜索谷歌,但找不到任何基本的东西.在它最基本的形式中,如何实现双重轮廓(对于体素地形)?我知道它做了什么,为什么,但无法理解如何做到这一点.JS或C#(最好)是好的.有没有人之前使用过双轮廓线并可以简单解释一下?
我最近在OpenGL 4.3中使用体素锥跟踪实现了软阴影,方法是在光的方向上跟踪一个圆锥并累积不透明度值.
我试图解决或隐藏的关键是当被遮挡的表面更靠近遮挡物时,非常有体素化的遮蔽效果,以及由于表面体素化而隐藏阴影中的清晰斑点.我使用的是低分辨率体素64x64x64; 然而,即使我使用更高分辨率的体素,一些处于更高mip-map水平的低分辨率体素仍然在迹线中被捕获.
因此,这里就是我的第一个想法是:我希望能够保持这种是最远的影子的最柔软的部件,更换更接近封堵器与阴影贴图的阴影部分.阴影贴图会因为距离每个遮挡物更远而褪色,我会以某种方式将其与锥形跟踪阴影混合在一起.
任何人都可以想办法根据每个物体与阴影贴图的距离来消除阴影,然后将其平滑地融入锥形追踪的阴影中吗?
我的另一个想法是以某种方式将阴影光线追踪到更靠近封堵器的表面上,但这可能太贵了.
或者,我欢迎任何其他想法来帮助改进我的软阴影算法.
我还提出了一个视频来展示它:
https://www.youtube.com/watch?v=SUiUlRojBpM
仍然没有找到解决阴影问题的方法.
所以,我正在寻找一个带有C++库(面向游戏)的体素图形引擎.只是为了好玩,这将是我第一次使用图形库,所以它不必非常复杂或强大,只是易于理解.
我需要帮助开始使用Python(我几乎不知道)来体验从Rhino生成的3D网格.数据输入将是.OBJ文件,输出也是如此.这种用法的最终目的是找到建筑物内两点之间的最短距离.但这是为了以后.至于现在,我需要首先体素化3D网格.体素化原语可能只是一个简单的立方体.
到目前为止,我可以从OBJ文件解析器读取并从解析后的obj中读取V,VT,VN,F前缀,并使用这些坐标查找3D对象的边界框.什么应该是对网格进行体素化的正确方法?
import objParser
import math
inputFile = 'test.obj'
vList = []; vtList = []; vnList = []; fList = []
def parseOBJ(inputFile):
list = []
vList, vtList, vnList, fList = objParser.getObj(inputFile)
print 'in parseOBJ'
#print vList, vtList, vnList, fList
return vList, vtList, vnList, fList
def findBBox(vList):
i = 0; j=0; x_min = float('inf'); x_max = float('-inf'); y_min = float('inf');
y_max = float('-inf'); z_min = float('inf'); z_max = float('-inf');
xWidth = 0; yWidth = 0; zWidth =0
print 'in findBBox' …
Run Code Online (Sandbox Code Playgroud) 想象一下N3分辨率的体积立方体,其中充满了遮挡体素.立方体可以完全填满,或包含弯曲的"隧道",或墙壁 - 或只是一些流浪的体素; 我们现在选择边界立方体的六个面中的任意两个,并尝试找到连接这两个面的线而不击中其中的任何体素.如果存在这样的线条,则面部可以看到彼此,否则,它们将完全被遮挡.
我的问题是:是否存在O(n)(或更好)算法以快速辨别是否可以绘制这样的线?线的确切参数无关紧要.
在我的(类似Minecraft)3D体素世界中,我希望平滑形状以获得更自然的视觉效果.我们先来看看2D中的这个例子.
左边是没有任何平滑的世界.地形数据是二进制的,每个体素都呈现为单位大小的立方体.
在中心,您可以看到一个天真的圆形平滑.它只考虑四个直接相邻的块.它仍然不是很自然.而且,我想要出现平坦的45度斜坡.
在右侧,您可以看到我想出的平滑算法.它需要考虑八个直接和对角线的邻居才能得出一个块的形状.我在线有C++代码.这是提供贝塞尔曲线绘制的控制点的代码.
#include <iostream>
using namespace std;
using namespace glm;
list<list<dvec2>> Points::find(ivec2 block)
{
// Control points
list<list<ivec2>> lines;
list<ivec2> *line = nullptr;
// Fetch blocks, neighbours start top left and count
// around the center block clock wise
int center = m_blocks->get(block);
int neighs[8];
for (int i = 0; i < 8; i++) {
auto coord = blockFromIndex(i);
neighs[i] = m_blocks->get(block + coord);
}
// Iterate over neighbour blocks
for (int i = 0; i …
Run Code Online (Sandbox Code Playgroud) 我需要编写一些代码来将四元组数组转换为体素字段.让它工作应该很容易,但快速实现并不是那么微不足道.
有谁知道我可以使用的任何库或源代码?我敢肯定以前有人必须这样做.
编辑: 算法也需要用体素填充模型的内部.只是一个shell不会这样做.
我有一个视线问题我需要通过访问两个(非网格对齐)点之间的3D体素空间中的所有可能单元来解决.
我考虑过使用3D Bresenham算法,但它会跳过一些细胞.
一个天真的实现可能是以比体素网格更高的分辨率检查沿线的点,但我希望有一个更智能的解决方案.
有人有任何线索吗?
具有3D均匀网格,为了节省大型模型中的存储器,不需要保存空单元(不与任何对象重叠的单元).为了这个目的,我在c#中使用Dictionary.尽管性能已经降低,但这仍然比创建3D网格时出现异常更好.现在我的问题是找到一个快速哈希函数,将网格的3d整数坐标映射到唯一的数字.
我已经尝试过((x*73856093 + y*19349669 + z*83492791))%n,它并不总是生成一个唯一的数字.