我正在尝试在ILNumerics中实现类似于Matlab的fill3函数并输出到SVG文件。 fill3允许您使用实心填充颜色绘制3d形状,并为要绘制的形状指定边缘颜色。
我用来绘制形状的代码如下:
var scene = new ILScene();
scene.Camera.Add(new ILTriangles
{
Positions = new float[,]
{
{-1, -1, -1}, {-1, 1, -1}, {0, 1, 0},
{-1, -1, -1}, {0, 1, 0}, {0, -1, 0},
{0, -1, 0}, {0, 1, 0}, {1, 1, -1},
{0, -1, 0}, {1, 1, -1}, {1, -1, -1}
},
Color = Color.Red,
AutoNormals = false
});
scene.Camera.Add(new ILLines
{
Positions = new float[,]
{
{-1, -1, -1}, {-1, 1, -1}, {0, 1, 0}, {0, -1, 0}
},
Indices = new[] {0, 1, 1, 2, 2, 3, 3, 0},
Color = Color.Black,
Width = 3
});
scene.Camera.Add(new ILLines
{
Positions = new float[,]
{
{0, -1, 0}, {0, 1, 0}, {1, 1, -1}, {1, -1, -1}
},
Indices = new[] { 0, 1, 1, 2, 2, 3, 3, 0 },
Color = Color.Black,
Width = 3
});
ilPanel1.Scene = scene;
我用来输出到SVG的代码如下:
using (var fs = new FileStream(@"C:\test.svg", FileMode.Create))
{
new ILSVGDriver(fs, scene: ilPanel1.GetCurrentScene(), width: 500, height: 600).Render();
}
结果在ILPanel中看起来很完美,但是当渲染到SVG时,三角形形状似乎踩到/覆盖线条。
还有另一种方法可以实现我想要的目标吗?谢谢!
答案 0 :(得分:0)
ILNumerics根据三角形渲染所有填充的形状。这提供了最大的灵活性,并且与所有3D引擎基本上工作的方式相对应。另一方面,SVG被设计为2D描述格式。它知道更多的形状而不仅仅是三角形 - 如果您在2D空间中,那么它是有意义的并且是有效的。理论上,您总是可以用三角形组合任何多边形。这就是我猜的所有渲染器在非常低端的完成(OpenGL至少这样做)。
现在,问题是,今天所有流行的SVG渲染器都试图“看起来很漂亮”。即他们渲染边缘抗锯齿。抗锯齿涉及透明度。透明度涉及颜色的变化。如果您尝试绘制抗锯齿的相邻边缘,则最终得到您获得的结果:边缘上的颜色会略有不同,留下一条虚线,预计会出现纯色区域。
这是SVG的限制 - 不是ILNumerics的限制。如果要使用SVG创建实心填充多边形形状,则需要使用SVG提供的形状进行“设计”。如果您在其他库创建的SVG文件中观察到不同的结果,请将这些SVG作为示例发布在此处,以便我们检查它们。我很确定他们不会使用三角形。 (?)