等距物体的自动阴影

我喜欢等距的物体。 一个例子:

精灵建设

我试图find一种方法来自动创建他们正在投射的影子。 我结束了以下转换:

matrix.Shear(-0.25f, -0.25f, MatrixOrder.Append); matrix.Translate(0.5f * source.Width, 0.125f * source.Height, MatrixOrder.Append); 

整个algorithm:

  string sourceFileName = @"c:\in.png"; string targetFileName = @"c:\out.png"; using (var source = (Bitmap)Bitmap.FromFile(sourceFileName)) { using (Bitmap target = new Bitmap(source.Width * 2, source.Height, PixelFormat.Format32bppArgb)) { using (var g = Graphics.FromImage(target)) { GraphicsPath gp = new GraphicsPath(); gp.AddPolygon(new Point[] { new Point(0, 0), new Point(source.Width, 0), new Point(0, source.Height) }); var matrix = new Matrix(); matrix.Reset(); matrix.Shear(-0.25f, -0.25f, MatrixOrder.Append); matrix.Translate(0.5f * source.Width, 0.125f * source.Height, MatrixOrder.Append); gp.Transform(matrix); g.DrawImage(source, gp.PathPoints); } var grayscale = new Bitmap(target.Width, target.Height, PixelFormat.Format32bppArgb); for (var x = 0; x < target.Width; x++) { for (var y = 0; y < target.Height; y++) { var pixel = target.GetPixel(x, y); if (pixel.A != 0) { pixel = Color.FromArgb(255 / 3, Color.Black); } grayscale.SetPixel(x, y, pixel); } } for (var x = 0; x < source.Width / 2; x++) { for (var y = source.Height - 1; y >= 0; y--) { var pixel = source.GetPixel(x, y); if (pixel.A != 0) { break; } else { grayscale.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0)); } } } grayscale.Save(targetFileName, ImageFormat.Png); } } 

其中产生如下:

阴影

它的作品 – 但不是100% – 阴影的角度根据源对象的比例而改变。 有没有一种方法或algorithm可以100%或更接近真实?

精灵村

(编辑更详细地解释)。

绝对没有办法让它完美,因为你根本没有足够的深度信息。 你有3D对象的二维表示。

想想这个。 如果它是一个真实的物体,会有一部分摄像机看不到,但是仍然挡住光线投下阴影。 另外,考虑每个像素,没有办法知道该像素的表面有多高。 我的意思是,我们可以看到,这些步骤是通向树屋的,但algorithm没有这种语义信息,只能看到二维的颜色和阿尔法。

我认为你所拥有的是你所希望的最好的方法。 虽然,像ashes999建议的,你可以使用Photoshop来调整你的投影/角度/轴心。

此外,你可以积累一些抖动的样本,以得到反锯齿的阴影,看起来更好。

至于角度取决于比例,我不确定你正在使用什么样的线性代数系统,但是你可以尝试使得剪切与精灵比例成反比,以抵消效应。 我会留给你试验。