【发布时间】:2018-01-04 15:17:23
【问题描述】:
我有一个有3个顶点的三角形,即:(x1,y1,z1); (x2,y2,z2) 和 (x3,y3,z3)。
我正在使用 Bresenhams 3D Line 算法,目前用于在三角形的两个顶点之间生成 3D 点,具体取决于分辨率大小(resSize)。
void Bresenham3Algo(float x0, float y0, float z0, float x1, float y1, float z1)
{
float dx = Math.Abs(x1 - x0);
float sx = x0 < x1 ? resSize : -resSize;
float dy = Math.Abs(y1 - y0);
float sy = y0 < y1 ? resSize : -resSize;
float dz = Math.Abs(z1 - z0);
float sz = z0 < z1 ? resSize : -resSize;
float dm = Math.Max(dx, Math.Max(dy, dz)), i = dm;
x1 = y1 = z1 = dm / 2;
for (; ; )
{
Console.WriteLine(x0,y0,z0); //Printing points here
if (i <= 0) break;
x1 -= dx; if (x1 < 0) { x1 += dm; x0 += sx; }
y1 -= dy; if (y1 < 0) { y1 += dm; y0 += sy; }
z1 -= dz; if (z1 < 0) { z1 += dm; z0 += sz; }
i -= resSize;
}
}
所以,截至目前,我调用了上述函数三次,在三个三角形边缘的边界上生成 3D 采样点。
Bresenham3Algo(x1,y1,z1,x2,y2,z2);
Bresenham3Algo(x2,y2,z2,x3,y3,z3);
Bresenham3Algo(x3,y3,z3,x1,y1,z1);
我发现很难找到位于三角形内部的内部采样点。
例如,如果我有顶点 (0,0,0); (5,0,0) 和 (3,3,0),借助上述函数,我在三个三角形边上找到了 3D 点,即
(0,0,0),(1,0,0),(2,0,0),(3,0,0),(4,0,0),(5,0,0) -> 第一条边
(3,3,0),(4,1,0),(4,2,0),(5,0,0) ->第二条边
(0,0,0),(1,1,0),(2,2,0),(3,3,0) -> 第三边
现在,我需要找到位于三角形内部的内部 3D 采样点,即 (2,1,0) , (3,1,0), (3,2,0)
如果有人可以帮助我解决这个算法,我会很高兴。
提前致谢!
【问题讨论】:
-
如果您不是绝对需要使用扫描线算法,那么this post 上的非常 简单的方法可能就是您所需要的。
-
使用我链接的副本并添加z坐标。如果你想要体积渲染,唯一的区别是你不需要 Zbuffer
if条件,而不是pixel[y][x]=col; depth[y][x]=z;应该使用voxel[z][y][x]=col;
标签: c# c++ 3d geometry bresenham