有哪些光栅化算法可以将 3d 球体投影到像素网格中?我想避免光线投射。本质上,给定一个 3d 坐标和一个半径,有没有一种快速的方法可以在像素网格上创建一个 2d 圆/椭圆?
例如:半径为 4 的 (2,2,2) 处的圆被投影到五个像素: p1(2,0)p2(0,1) p3(1,1) p4(2,1)p5(1,2 )
我遇到过诸如粒子系统的像素飞溅之类的技术,但我还没有找到关于如何做到这一点的明确答案。
谢谢
有哪些光栅化算法可以将 3d 球体投影到像素网格中?我想避免光线投射。本质上,给定一个 3d 坐标和一个半径,有没有一种快速的方法可以在像素网格上创建一个 2d 圆/椭圆?
例如:半径为 4 的 (2,2,2) 处的圆被投影到五个像素: p1(2,0)p2(0,1) p3(1,1) p4(2,1)p5(1,2 )
我遇到过诸如粒子系统的像素飞溅之类的技术,但我还没有找到关于如何做到这一点的明确答案。
谢谢
你有什么投影?
我很确定投影不是最有趣的圆圈。嗯。我想我会这样做的方法是在 3d 中找到其轴*与相机点对齐的圆周。从圆圈中选择任何需要的点,然后将它们转换为屏幕空间。最简单的是,这会给你一个多边形,但插值样条曲线可能也应该给你很好的结果。
*:旋转对称轴
很酷,所以假设您只是将 x,y 从球体的 x,y,z 中取出来形成您的圆圈。您如何在像素网格上对适当的像素进行着色?基本上,光栅化圆的算法是什么?
也许最简单的方法(如果您不介意一些线性代数)是使用 4x4 投影变换矩阵。事实上,几乎任何类型的 3D 转换都可以使用 4x4 矩阵执行。
这是一篇帮助您入门的Wikipedia 文章。
听起来你愿意忍受对真实投影的一点不忠,以获得更简单的计算。如果是这样,请跟随...
我将首先假设您可以移动、旋转和调整球体的大小以匹配投影圆的坐标系。让我们将它们的半径称为 r,并假设球体的中心位于 (0,0,0) 处,圆的中心位于 (0,0) 处。两者的 X 轴从左向右运行,Y 轴从下向上运行,Z 轴从后向前运行。
这是有趣的部分:你已经完成了。球体和圆的 X 和 Y 坐标相同!如果 Z 坐标为正,则该点可见,如果为负,则该点隐藏在球体的背面。
我不明白你的问题 100%。您的像素网格 = 屏幕空间中的像素还是有固定比率?
根据我的最佳猜测,您可以尝试以下方法:
将内部视口坐标与屏幕空间像素映射并计算比率。使用该比率将您的对象准确地放置在您想要的位置。我使用这种方法编写了一个基于窗口(不是全屏)的 D3D 应用程序,以允许鼠标与 3D 对象交互。这允许使用鼠标移动和调整对象的大小,使其感觉就像普通的 Windows 应用程序。我通过反复试验计算出了这个比率(我不擅长矩阵计算)。
如果你没有像我上面那样干扰视图投影矩阵,3D 坐标是从左到右和从下到上的 -1.0f 到 1.0f。因此,您可以使用上述相同的方法轻松计算出比例并适当放置对象
球体在平面上的投影是一个椭圆,但它可以近似为一个圆。这可以与点的透视投影几乎相同。
假设屏幕中心为(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 坐标接近于零,则该圆仅是球体投影的良好近似。