如何确定两个 3D 边缘是否相同
How can I determine if two 3d edges are identical?
我正在尝试检测 3d 对象的轮廓边缘。我知道你必须首先确定一张脸正在看一个位置的天气,然后找到正面和背面之间共享的边缘。
我已经能够弄清楚正面和背面的东西,但我无法弄清楚如何在没有很多 if 语句的情况下找到边缘是否被共享。我的顶点数据存储在每个多边形的 x1,z1,y1,x2,z2,y2,x3,z3,y3 中。
如果你问如何确定两条线段是否在同一条线上,你可以使用一点欧几里得几何。让我们介绍几个定义:
点 A 是实数的 n 元组(a1, a2, ..., an)
。在 3D 情况下,n=3
.
点 A 和实数 t
的标量乘法定义为
tA = (t*a1, t*a2, ..., t*an)
有了这两个想法,我们可以很容易地表示一条线。对于A
和B
两个点,满足方程的点P
P = tA + (1-t)B
在AB
t
是实数的行上。
当0 <= t <= 1
时,P
介于A
和B
之间,t=1
时P=A
,t=0
时P=B
。
现在,为了将其置于编程角度,您可以创建两个类:Point
和 Line
。使用上面给出的方程,很容易确定Point
是否位于给定的Line
上。要确定两条线段是否在同一条线上,只需使用定义一个Line
的两个Point
并检查它们是否位于另一条Line
上。
如果 2 条线段是同一条线
如果两个线段使用相同的点坐标或相同的点索引,则它们是相同的。测试它们是否在同一条线上是完全不同的问题,您无需解决即可找到轮廓。
- 使用索引基元。
- 加载模型时,提前预先计算边列表和所需的拓扑表。
- 如果您正在尝试绘制阴影,请使用阴影贴图 - 它们更容易理解。
索引基元意味着
1.将所有点存储在数组中(std::vector<vector3> points;
或类似的东西,其中vector3
是存储xyz坐标的数据类型(,并且每个点都是唯一的。
2. 面和边是指使用整数点索引的点。
即
struct Vec3{
float x, y, z;
};
typedef unsigned int Index;
struct Face{
enum{vertsPerFace=3};
Index verts[vertsPerFace];
};
struct Edge{
enum{vertsPerEdge=2};
Index verts[vertsPerEdge];
};
加载模型时,可以构建点列表,并使用std::set
std::map
或类似结构将所有面转换为索引基元。一旦你建立了索引基元,你就可以构建关联表(使用 std::map(,这些表将边映射到人脸列表std::multimap<std::pair<Index, Index>, FaceIndex>
,将边映射到使用这些边的人脸索引std::map<std::pair<VertexIndex, VertexIndex>, FaceIndex>
等等。
- 无法将结构注册为增强几何体3D点
- OpenGL大的3D纹理(>2GB)非常慢
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 如何获取边缘窗口句柄 (HWND)?
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 提升如何在图形可视化中写入边缘的权重?
- 在 c++ 中使用 Tensorflow Lite 在边缘 TPU 上运行"mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite"时出现问题
- 分数背包边缘箱
- 如何从 3D 曲面网格中删除自相交三角形?
- CUDA 使用共享内存平铺 3D 卷积实现
- 应用程序无法找到铬边缘浏览器
- 检查框内的 3D 点
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 使用 C++在 OpenGL 中对 3D 多边形进行纹理处理
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 处理3D数组的边缘和角案例的方法
- 如何确定两个 3D 边缘是否相同