将3d球体投影到屏幕上的2d圆圈中

时间:2008-12-26 00:03:53

标签: graphics 3d particles rasterizing

有哪些栅格化算法可以将3d球体投影到像素网格中?我想避免光线投射。基本上,给定一个三维坐标和一个半径,是否有一种快速的方法可以在像素网格上创建一个2d圆/椭圆?

例如:半径为4的圆圈(2,2,2)投影到五个像素: p1(2,0)p2(0,1)p3(1,1)p4(2,1)p5(1,2)

我遇到了粒子系统的像素喷溅等技术,但我没有找到关于如何做到这一点的明确答案。

由于

6 个答案:

答案 0 :(得分:1)

你有什么预测?

我很确定投影不是最有趣的投影。嗯。我想我会这样做的方法是找到3d中的圆周圆,其轴*与摄像机点对齐。从圆圈中选择所需的任何点,然后将它们转换为屏幕空间。最简单的说,这会给你一个多边形,但插值样条也可能会给你很好的结果。

*:旋转对称轴

答案 1 :(得分:0)

我不明白你的问题100%。您的像素网格=屏幕空间中的像素还是有固定比率?

从我最好的猜测中,你可以试试这些:

使用屏幕空间像素映射内部视图端口坐标并计算比率。使用该比率将对象准确放置在您想要的位置。我使用这种方法编写了一个D3D应用程序,基于窗口(不是全屏),允许鼠标与3D对象进行交互。这允许使用鼠标移动和调整对象的大小,这使它感觉像普通的Windows应用程序。我通过反复试验计算了这个比率(我对矩阵计算不好)。

如果您没有像我上面那样打扰视图投影矩阵,则3D坐标从左到右,从下到上依次为-1.0f到1.0f。因此,您可以使用上面相同的方法轻松计算出比例并适当放置对象

答案 2 :(得分:0)

也许最简单的方法(如果你不介意一些线性代数)是使用4x4投影变换矩阵。事实上,几乎任何类型的3D变换都可以使用4x4矩阵进行。

这是一个Wikipedia article,可以帮助您入门。

答案 3 :(得分:0)

听起来你似乎愿意忍受一些不忠实的真实投射以获得更简单的计算。如果是这样,请继续......

我将首先假设您可以移动,旋转和调整球体的大小以匹配投影圆的坐标系。让我们将r调用为两者的半径,并假设球体的中心位于(0,0,0),圆圈的中心位于(0,0)。 X轴为左右两个运行,Y轴为两个运行的底部,Z轴向前运行为球体。

这是有趣的部分:你已经完成了。球体和圆形的X和Y坐标是相同的!如果Z坐标是正的,则该点是可见的,如果它是负的,则该点隐藏在球体的背面。

答案 4 :(得分:0)

很酷,所以假设你只是从球体的x,y,z中取出x,y来形成你的圆圈。你如何在像素网格上着色适当的像素?基本上,光栅化圆的算法是什么?

答案 5 :(得分:0)

球体在平面上的投影是一个椭圆,但它可以用圆近似。这可以与点的透视投影几乎相同。

假设屏幕的中心是(X = 0,Y = 0),并且观看者位于(X = 0,Y = 0,Z = 0)。 如果球体位于(sX,sY,sZ)半径为sR,并且屏幕距离观察者D个单位(焦距),则圆圈将处于(cX = sX * D / sZ,cY = sY * D / sZ)半径为cR = sR * D / sZ。一切都只是由D / sZ缩放。

如果焦距(D)很大,或者球体的sX和sY坐标接近于零,则该圆圈只是球体投影的良好近似值。