- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果 3D 空间中的三角形(由其顶点和法线指定)从 3D 空间中的给定点可见(由其 x、y 和 z co 指定),我想编写一个返回“True”的函数rds) 鉴于空间中的其他三角形可能充当“障碍物”,阻止您从该点看到指定的三角形。
“看见”和“可见”是指可以用不与任何点相交的直线线将三角形上的任何点连接到观察点阻塞三角形。
hopefully this shows what I mean
我研究了“z 缓冲”和其他解决“可见性问题”的技术,但是由于我没有将三角形渲染成像素以通过特定视口(viewport)显示在屏幕上,我认为这些是不相关的。
我的两个天真的方法是;
1) 从观察点通过潜在“阻塞”三角形的每个顶点投影一条线到某个非常大的半径(对于我的应用程序,没有三角形距离观察点超过 1000 个单位,所以我会选择1001 个单位)。然后我会在三角形后面有一个区域,其边缘由我投影的线描述,在该区域中看不到对象。我会对所有阻挡物执行此操作,然后找到所有这些区域的并集,并检查我的测试三角形是否落在创建的(可能很多)区域之一内。
或
2) 再次向所有阻挡三角形顶点射线,找到这些线与待测三角形所在平面相交的点,得到平面中每个阻挡物的投影三角形。将任何重叠的投影三角形合并为一个多边形。然后检查被测三角形是否完全位于任何投影三角形或合并多边形内。
方法 1) 的问题在于,很难找到一个形状是否完全被 3D 体积包围,更难将相交的 3D 体积组合成一个大的 3D 体积。
方法 2) 的问题在某些情况下,通过阻塞三角形顶点的投影线永远不会碰到感兴趣的三角形的平面。也不能忽略这些情况,它们仍然可以遮挡感兴趣的三角形,它们只是在平面上投下无限长的阴影。
我倾向于方法 2,但就像我说的那样,这些方法似乎有点天真,如果有人能提出更优雅的解决方案,我会非常感兴趣!描述或伪代码是理想的,最终我希望在 matlab 或 c++ 中实现它,但现在让我们保持通用!
最佳答案
我也会采用您的第二种方法,但要进行一些修改。
首先,假设您要将三角形投影到某个平面上。这里有几架飞机可供选择,但我不确定哪架飞机更适合您:
您可以将所有三角形投影到您测试的三角形平面上。通过这种方式,如果您的遮挡三角形位于被测遮挡三角形的前面或后面,您可以轻松获得信息。不利之处在于,当您查看测试三角形上的掠角时,数值误差会增加并可能会破坏您的解决方案。
下一个选项,我将从它开始,选择 6 个轴对齐的平面之一进行投影。将它们想象成天空盒的墙壁。根据观察者和三角形的相对位置,您可以选择沿轴距离最大的一个。此外,选择与轴对齐的平面可能会稍微简化您的数学运算。
下一个选项可能是使用垂直于观察者和三角形中心之间的线的平面。当您将三角形放置在极端角度时,此选项可以最大限度地减少错误,但您需要自己进行测试。
投影测试三角形后,您可以计算它的边界矩形 - 这是您感兴趣的区域,您不需要知道它之外的任何内容。您可以计算 4 个穿过观察者和矩形边界的平面,就像典型的视锥体一样。
当您投影遮挡三角形时,您建议将它们全部连接成一个大多边形,但这样您最终可能会得到一个非常复杂的多边形。我会采取相反的方式,从您正在测试的投影三角形中减去投影遮挡物。在这种方法中,您不需要测试每个三角形组合,因为如果在任何时候您的投影三角形减少为空三角形 - 这意味着它已经被遮挡,无需测试其余的遮挡器。
这是最重要的部分:
据我所知,唯一不可能以这种方式投影的三角形是那些至少有一个顶点在观察者后面(或恰好在侧面)的三角形。所以对于那些你可以用你的截头体剪裁平面剪裁它们。裁剪一个三角形的结果可能包含很少的新三角形,但它们都将适合您上面定义的感兴趣区域。
如果您决定执行所有这些操作,请记住您的遮挡物可能在测试三角形后面,因此您需要考虑到这一点。最简单的解决方案是用经过测试的三角形平面将它们夹住,只留下前面的部分。
关于algorithm - 查明 3d 空间中的特定三角形是否从给定点可见,并且可能有任意多个其他三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38754216/
SDL3 提供了 SDL_RenderGeometry 函数绘制几何图形,用法和 OpenGL 差不多,先定义顶点数据,然后根据顶点数据绘制几何图形。 绘制三角形的代码如下: std::array
我想在图像上使用三角形类型按钮,但我无法执行此操作... 如何做到这一点? 最佳答案 这个project可以帮你。您可以自定义 UIButton 的形状。 关于iphone - 定制非矩形按钮 三角形
我一直在尝试找出如何使用 Python 制作彩虹三角螺旋。我可以制作一个方形螺旋,但它不会导入颜色。而且它不使用三角形。 输出应该是什么样子: 我取得的成就: 我的代码: import tur
我正在使用 this 研究三角形检测算法文章。我编写了这段代码,但不幸的是,当三角形之间存在交集时,该方法返回 false。 private boolean checkTriangleCollisio
我在资源文件中找到了几个关于如何在 Android 中绘制三角形的答案。但是我没有找到任何可以解释如何更改三角形旋转的内容。 我找到的例子:
对于编码类(class)中的作业,我应该找到一种方法让 Python 制作星号三角形,如下所示: x xx xxx 但是,无论我用我的代码做什么,我都无法做到这一点。最好的我可以得到的是:
我在绘制两个多边形时遇到问题。我想填充两个三角形,但一个大于第二个。我在 winforms 中使用 UserControl。代码: Point[] DOWN = new Point[] {new Po
如何测试三角形和正方形是否相交? 当我们知道它是正方形而不是矩形时,有什么方法可以优化它吗?此外,正方形是轴对齐的,这样应该可以进一步提升性能? 或者我应该把正方形分成三角形,然后对三角形-三角形相交
我有一个方法是画一个多边形,然后将多边形向右旋转90度,使其原来的顶点现在指向右边。 这是绘制多边形(三角形)的代码,但我不知道如何旋转它。 Point[] points = new Point[3]
我知道有高效的多边形裁剪算法(例如 Maillot、Vatti、Greiner-Hormann)。然而,这些算法适用于任意多边形,尽管它们适合我的情况,但在我看来,对像我这样的简单情况使用这种通用算法
我的问题可能很愚蠢,但我没有找到三角形 strip 使用的好例子: http://i.stack.imgur.com/KL8jk.png 像这样的顶点: A: -0.5f, -0.5f, // Bo
我正在尝试创建一个等边三角形,您可以在 fiddle 中看到它: 我的想法是,我将笔放在 (0, 0) 处,然后在 (20, 11) 处画线,但三角形看起来不正确。 最佳答案 您的三角形已被
通过编写一些逻辑代码,只是无法弄清楚如何以所需的形式获得 01 三角形的输出,三角形确实打印出来,但不是根据要求的输出。 import java.util.Scanner; import java
我一直在尝试制作一个简单的 pygame 程序来检查光标是否在三角形内部或外部。我通过找到较大三角形的面积,然后从鼠标位置到所有三个点制作三个内部三角形并找到它们的面积来完成此操作。 根据我的理解,如
我有一个方法 drawTriangle,它在 JAVA 中的 OpenGL 程序的 display() 方法中被引用。 public void drawTriangle(GL gl, int x1,
我正在尝试用 C++ 创建一个程序,该程序将数字的三角形模式放入二维数组中。 示例: 1 3 4 5 9 2 9 4 6 1 顶行是一个数字(整数),三角形的每一行比它上面的行多一
所以我最近一直在尝试学习 OpenGL,遵循了几个文本和视频教程。 我无法绘制三角形,我已经双重和三次检查我是否以正确的顺序执行了所有必要的步骤,但我显然遗漏了一些东西 在添加一些代码之前,我应该声明
我遇到了一个用递归绘制谢尔宾斯基三角形的程序。我如何解释这段代码是调用 sierpinski1 直到 n == 0,然后只绘制 3 个小三角形(每次调用一个三角形),因为 n == 0 是绘制某些东西
我有一个需要 3 个点的函数,我将使用这些点来绘制一个三角形,就好像我在使用 glVertex 函数一样。 但由于我想在避免透视变形的同时对这个三角形进行纹理贴图,我必须对其进行 segmentati
下面的代码应该为三角形添加一个 3d 对象,但我收到错误 Assets/Scripts/MakeTriangle.cs(6,28):错误 CS0120:需要对象引用才能访问非静态成员 `UnityEn
我是一名优秀的程序员,十分优秀!