English 中文(简体)
将三维球体投影成二维圆形在屏幕上呈现。
原标题:
  • 时间:2008-12-26 00:03:52
  •  标签:

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

For example: circle at (2,2,2) with radius 4 gets projected to five pixels: p1(2,0)p2(0,1) p3(1,1) p4(2,1)p5(1,2)

我曾经接触过像素喷溅等粒子系统技术,但是我还没有找到如何实现它的明确答案。

谢谢 (xiè xiè)

问题回答

你用的是哪种投影方式?

我相当确定在最有趣的其中一些中,投影不是圆形。嗯。我想我会找到一个在三维空间中轴线*与相机点对齐的圆周。从圆周中挑选任意所需点,将它们转换到屏幕空间。最简单的情况下,那会给你一个多边形,但经过插值的样条曲线可能也会给你很好的结果。

轴对称轴

我并不完全理解你的问题。您的像素网格=屏幕空间中的像素还是有一个固定比率?

从我最好的猜测来看,你可以尝试这些:

将内部视口坐标映射到屏幕空间像素,并计算比率。使用该比率将对象放置在所需位置。我编写了一个基于Windows的D3D应用程序(非全屏),使用此方法可以允许鼠标与3D对象进行交互。这样可以使用鼠标移动和调整对象大小,使其感觉像普通的Windows应用程序。我通过反复试验来计算比率(我不擅长矩阵计算)。

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

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

这是一个维基百科文章,让你开始。

如果你愿意容忍一点不忠实来获得更简单的计算,那么请跟我来……

我将从假设您可以将球体移动、旋转和调整大小以匹配投影圆的坐标系开始。 让我们称r为它们两个的半径,并假设球的中心位于(0,0,0),圆的中心位于(0,0)。 X轴从左到右运行,Y轴从下到上运行,Z轴从球体的后面到前面。

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

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

球体在平面上的投影是椭圆,但它可以用圆形来近似。这几乎和点的透视投影一样做。

Assume the center of the screen is (X=0,Y=0), and the viewer is located at (X=0,Y=0,Z=0). If the sphere is at (sX,sY,sZ) with a radius of sR, and the screen is D units away from the viewer (focal distance), then the circle will be at (cX = sX * D / sZ, cY = sY * D / sZ) with a radius of cR = sR * D / sZ. Everything is simply scaled by D / sZ.

如果焦距(D)很大或者球的sX和sY坐标接近于零,那么这个圆只是球形投影的一个很好的近似。





相关问题
热门标签