Geometry 高效地在体素中绘制球体曲面?

Geometry 高效地在体素中绘制球体曲面?,geometry,Geometry,我有一个大的3D网格(为了简单起见,网格盒的最小尺寸为1x1x1),我只想在这个网格中绘制大量半径可变的球体的表面。但是我想消除典型的孔和丘的光栅化问题 我也不想使用暴力手段(找到球体中心半径内的所有像素,移除非边界像素),因为我将创建数百万个这样的球体,其中一些可能具有非常高的半径。圆圈的形状与我想要的相似,但我想知道如何使其适应球体形状 有人能帮忙吗?好的,我想我已经解决了。但不确定这是否是最有效的版本 从本质上讲,球体的曲面由一组半径为r的无限圆组成,半径r在穿过垂直于与该圆相交的平面的轴

我有一个大的3D网格(为了简单起见,网格盒的最小尺寸为1x1x1),我只想在这个网格中绘制大量半径可变的球体的表面。但是我想消除典型的孔和丘的光栅化问题

我也不想使用暴力手段(找到球体中心半径内的所有像素,移除非边界像素),因为我将创建数百万个这样的球体,其中一些可能具有非常高的半径。圆圈的形状与我想要的相似,但我想知道如何使其适应球体形状


有人能帮忙吗?

好的,我想我已经解决了。但不确定这是否是最有效的版本

从本质上讲,球体的曲面由一组半径为r的无限圆组成,半径r在穿过垂直于与该圆相交的平面的轴时先增大后减小。半径的增加和减少可以用半圆来描述

在离散空间中,我们可以通过使用Bresenham算法绘制一组圆来高效地模拟球体的表面,其中半径是使用附加的Bresenham圆计算的,该圆的半径是球体的半径。这个半径被设想为从第三维度的圆“向上”伸出

其他的圆圈围绕着它建造,就好像主圆圈是一个建筑框架

我不完全确定这是否那么容易理解,因此希望该算法能提供更多信息:

public static void bresenhamSphere(Vector3 centre, int radius)
    {
        List<Vector3> points = new List<Vector3>();
        foreach (Point coord in bresenhemCircle(new Point(0,0), radius)) //get the set of points for an initial bresenham circle centred at the origin (we'll add the coordinates later)
        {
            int z = coord.Y; //I think you should be able to pick which coord matches to Z and which matches to radius arbitrarily, but this was more intuitive
            int r = coord.X; //the radius for the new circles
            foreach(Point point in bresenhemCircle(new Point((int)(centre.X),(int)(centre.Y)), r)) //get the circle spans around the original circle, this will make the surface of the sphere - this time create them at the x and y coordinates of the centre point supplied in the parameters
            {
                points.Add(new Vector3(point.X, point.Y, (int)(centre.Z) + z)); //convert the 2D results into 3D points by adding in the z value and add to the list.
            }
        }
    }
公共静态空心bresenhamSphere(矢量3中心,整数半径)
{
列表点=新列表();
foreach(bresenhemCircle中的点坐标(新点(0,0),半径))//获取以原点为中心的初始bresenham圆的点集(稍后我们将添加坐标)
{
int z=coord.Y;//我认为您应该能够任意选择哪个坐标与z匹配,哪个与半径匹配,但这更直观
int r=coord.X;//新圆的半径
foreach(bresenhemCircle中的点(新点((int)(center.X),(int)(center.Y)),r))//获取原始圆周围的圆跨度,这将生成球体的曲面-这次在参数中提供的中心点的X和Y坐标处创建它们
{
points.Add(新矢量3(point.X,point.Y,(int)(center.Z)+Z));//通过添加Z值并添加到列表中,将二维结果转换为三维点。
}
}
}
其中,BresenhamCircle(中心,半径)返回由提供的中心和半径构成的圆的圆周上所有像素的坐标

其中,Bresenham半圆(中心,半径)返回由提供的中心和半径构成的半圆圆周上所有像素的坐标


一个额外的增强是不在新的圆圈上添加初始点,因为我们已经从最初的圆圈运行中获得了这些点,但我不确定这会带来多少好处。

类似:啊,感谢您找到这一点。我自己也遇到过第一个链接,但假设他们正在寻找一个填充球体,因为响应只包括我上面概述的蛮力方法(或者跨度方法,除非我能计算角度变化中体素过渡的精确跨度,否则对我没有帮助。原则上看起来不错(我自己没有尝试过)。有趣的是,谷歌搜索“球体光栅化”并没有发现任何有趣的东西……我的一部分感觉布雷森厄姆的直线+圆中使用的技术必须可以扩展到曲面,但我找不到任何人这样做!我想如果圆算法被扩展到包含初始错误或分数半径。我想你最终会遇到一个问题,在球体赤道附近,当你画几次同一个圆时,它会变成一个圆柱体。实际上,即使x=0或y=0点保持不变,穿过圆弧的距离也会略有变化。我想当你沿着第一个圆(半径)走的时候,使用每个点的累积误差作为第二个圆的输入将解决该问题。