Articles of 计算几何

对所有可能的方向进行最快的能见度计算

我正在寻找你的建议。 我有一个庞大的体素化模型,就像图片中的那个(但是有更多的几百万个体素)。 为了减less模型的三角形总数,我可以去除体素中的共享面,但是三角形确实会保持很多。 我需要做的是创建一个索引,该索引将包含来自以下过程的布尔列表(可见/不可见)信息: 定义一组点,如图中3个黄色三维像素的质心(但是,这个集合可能再次包含数百万个点),并且每个点计算哪个体素(除了它们相应的容器)可以被看到(直接和未被阻挡的线的网站)向所有方向(像全球照明概念)。 如果射线源(来自给定点)甚至可以达到目标体素的最小值,则意味着我们对于该体素具有“真实”条件。 例如,如果我们假设图片中的射线源点是光源,那么蓝色圆圈中的所有体素对于特定点都是“真实的”。 这与游戏开发无关,所以如果我的post应该在其他地方,我很抱歉。 我只是觉得我应该在这里问一下,因为我的大部分search结果都是光线投射,硬阴影,可见的表面确定,OpenGL等,在这里非常相关。 我不需要看到任何graphics(或者具有较高的fps:D),只需要将结果存储到第三个模拟过程中即可。 我感觉到,如果我实施简单的几何计算,这个索引将运行时间太长(尽管这可以相当容易并行,我相信)。 尽管如此,我可以利用OpenGL和GPU吗? 这会大大提高我的工作吗? 我应该如何处理这个问题? 我正在使用华硕ROG-G752VY。 我只需要构建和存储这个索引(如果数十亿字节,我不会感到惊讶)。 模拟的其余部分不断运行在一个集群上。 此索引计算操作将只会运行一次或多或less。 我只是不知道用这个数量的射线源点我会提到什么执行时间(天/星期/年)以及对所有方向和体素的“粗暴”检查(使用或不使用OpenGL和GPU)。 但是,我可以预测,每次可见体素的最大数量将只有几千。 这是因为(遗憾的是,没有提及它),当它的行程距离超过“x”单位(“x”将比整个模型的尺寸小得多)时,这条射线有一个终生逻辑。 因此,对于比“X”更远的光线,search过程应该每次都会中断。 非常感谢你的时间!

快速的软件色彩插值三角形光栅化技术

我正在使用这种光栅化方法实现一个软件渲染器,但是,我想知道是否有可能改进它,或者如果存在更快的替代技术。 我特别感兴趣的是渲染小三角形,就像这个100k多龙的那个: 正如你所看到的,我使用的方法也不完美,因为它会不时出现小差距(至less我认为这是发生了什么)。 我不介意使用程序集优化。 伪代码或实际的代码(C / C + +或类似)赞赏。 提前致谢。

生成阴影卷的网格

给定一个网格,我想生成另外一个网格,这个网格实际上是这个网格的阴影体积。 我正在寻找一个algorithm/解决scheme/实现/参考,可以做到这一点下面的约束: 我有一个单一的 点光源。 从而: 不是多边形; 我想要硬边/面(不是软阴影) 光源在无限远处,实际上可以假定为直接在网格上方。 从而: 投影实际上是正交的,只依赖于一个方向。 我想要一个确切的解决scheme 结果网格不用于显示,因此不能像许多algorithm那样基于分辨率相关的栅格化。 一个朴素的algorithm是在远离光线的方向(例如向下)挤出所有网格三角形,并对所有这些挤出的“棱镜”进行CSG结合。 这里的缺点是: 它对所有的三角形都是这样,而不仅仅是可见的(如何做到精确的可见性? 它需要大量昂贵的CSG操作。 我正在寻找一个更有效的algorithm。

延长线(双向) – 穿越零线

我试图延长线,一定数量。 我想将修改应用到这两行上的点,并在两个方向上进行扩展。 而不是从目前的位置移动(中心点扩展是可以接受的,但我不知道如何应用它)。 确切的细节: 线: 点1 [X = 1,Y = 4],点2 [X = -1,Y = 6] 线归一化vector: V = [X = -0.707106,Y = 0.707106] 展开: E = 1 所以我正在寻找的结果是 新线= [1.707,4.707]〜[-1.707,6.707] 当我乘以Point2 [X] +((0-V [x])* E)= – 0.292 有人可以给一个简单的例子。 Psudo代码,太棒了! 我知道这是因为我穿越了零线,但是我确定有一个更好的方法来做这个比testing如果点大于零或小于零。

我如何计算球的正反面?

我有这个漂亮的绘画: http://bildr.no/view/1085283 我知道球的中心和矩形的中心,但我怎么知道(编程C#)球的矩形的哪一侧? 通过我的绘制,这种情况下的答案应该是正确的一面。

分段 – 汽缸相交

什么是完整的代码(C#,伪,无关紧要)计算结果段(或缺乏)的一个段和一个圆柱的交集? 该段由Vector3 (x,y,z)定义为Start , Vector3 (x,y,z)定义为End 。 气缸由相同的参数加上Radius的值定义。

testing两个立方体是否在空间接触

有没有人有任何testing3D空间中的两个立方体是否有任何干净的想法? 我的意思是,触摸角落,脸部或边缘。 假设立方体是轴alignment的,没有立方体的嵌套。 所以要么立方体接触,要么他们不接触。 根本没有立方体的重叠(除了可能的边缘或角点)。 我所想到的一切最终都需要大量的案例。 数值稳定性也是一个因素。 我不想只在所有的边缘/点上testing==。 我想我可以利用某种types的epsilon而不是testing是否== 0。然而,主要的事情是最小化案件的数量来testing。

Z缓冲algorithm的图像 – 空间相干性

我正在阅读由Ned Greene等人撰写的 Hierarchical z-Buffer Visibility 。 他们表示 传统的Z缓冲技术在扫描转换过程中能够很好地利用图像空间的一致性。 我不知道我所知道的z-bufferalgorithm是 如何使用图像空间相干性的。 他们在这篇文章中表示 实现通常为每个多边形进行设置计算,然后对多边形中的每个像素进行增量更新。 这个“设置计算”和“增量更新” 究竟是如何定义的?

确定多边形网格的切割部分

我有一个多边形网格 ,由顶点$ V $,边$ E $和面$ F $定义。 人们可以将其视为现实生活中的三维地形。 我想获得由垂直切割平面定义的这个地形的切割部分。 我可以用什么algorithm来高效地确定地形的切割部分? 这里的切割部分仅仅是切割部分垂直平面与多边形网格之间的交线的折线。 编辑:由于我的高程图是一个网格,这意味着我知道与顶点,面和边相关的每个信息,例如哪些面连接到哪个边。是否可以利用这些信息来加速剪切部分进一步?

OpenGL – 有对象跟随鼠标

我想在OpenGL中的屏幕上围绕我的鼠标。 (我也使用GLEW,GLFW和GLM)。 我想到的最好的想法是: 用glfwGetCursorPos获取窗口内的坐标。 该窗口是用来创建的 window = glfwCreateWindow( 1024, 768, "Test", NULL, NULL); 和获得坐标的代码是 double xpos, ypos; glfwGetCursorPos(window, &xpos, &ypos); 接下来,我使用GLM unproject,获取“对象空间”中的坐标 glm::vec4 viewport = glm::vec4(0.0f, 0.0f, 1024.0f, 768.0f); glm::vec3 pos = glm::vec3(xpos, ypos, 0.0f); glm::vec3 un = glm::unProject(pos, View*Model, Projection, viewport); 我已经看到两个潜在的问题。 视口是好的,因为左下角的x,y坐标的初始值确实是0,0,它的确是一个1024 * 768的窗口。 但是,我创建的位置向量看起来不正确。 Z坐标应该不是零。 然而,glfwGetCursorPos返回二维坐标,我不知道如何从那里到三维窗口坐标,特别是因为我不知道窗口坐标的第三维甚至意味着什么(因为电脑屏幕是2D)。 然后,我不确定我是否正确使用未正确使用。 假设视图,模型,投影matrix都可以。 如果我在窗口坐标中传递了正确的位置vector,那么unproject调用是否给了对象坐标中的坐标? 我认为这样做,但文件不清楚。 最后,我要跟随鼠标左右对象的每个顶点,我只是通过un [0]递增x坐标,通过-un […]