Graphics 将三维球体投影到屏幕上的二维圆中

Graphics 将三维球体投影到屏幕上的二维圆中,graphics,3d,particles,rasterizing,Graphics,3d,Particles,Rasterizing,哪些光栅化算法可以将3d球体投影到像素网格中?我想避免光线投射。基本上,给定一个三维坐标和半径,有没有一种快速的方法可以在像素网格上创建一个二维圆/椭圆 例如:半径为4的(2,2,2)处的圆投影到五个像素: p1(2,0)p2(0,1)p3(1,1)p4(2,1)p5(1,2) 我曾经遇到过一些技术,比如粒子系统的像素喷溅,但我还没有找到一个明确的答案 谢谢你有什么投影 我很确定在最有趣的投影中,投影不是一个圆。嗯,我想我的方法应该是在3d中找到圆周,其轴*与相机点对齐。从圆圈中选择所需的任何点

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

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

我曾经遇到过一些技术,比如粒子系统的像素喷溅,但我还没有找到一个明确的答案


谢谢

你有什么投影

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


*:旋转对称轴

我不完全理解你的问题。你的像素网格=屏幕空间中的像素还是有固定的比例

根据我的猜测,您可以尝试以下方法:

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

如果没有像我上面所做的那样干扰视图投影矩阵,则三维坐标为-1.0f到1.0f从左到右,从下到上。因此,您可以很容易地计算出比率,并使用上面相同的方法适当地放置对象

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


下面是一个让你开始的例子。

听起来你愿意忍受对真实投影的一些不忠实,以获得更简单的计算。如果是这样的话,请跟随

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


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

很酷,因此假设您仅从球体的x,y,Z中取出x,y来形成圆。如何在像素网格上对适当的像素进行着色?。基本上,光栅化圆的算法是什么?

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

假设屏幕的中心是(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坐标接近于零,则此圆仅是球体投影的良好近似值。

是否应具有抗锯齿功能?我不理解您的示例。你是说p1(1,0)?这是一个好的重要问题,我想了十多年了(因为我的数学直觉比我的知识要好)。你真的需要两样东西:1)给定一个3D点和一个球体的半径,得到椭圆的2D中心,角度,长轴和短轴,或者它的两个焦点。2) 如何扫描轴与X或Y轴不对齐的椭圆。