使用RadialGradientBrush绘制球体

8

我正在尝试在WPF中为游戏绘制球形碎片。这些碎片是用径向渐变画成的椭圆形。如下图所示,我的黑色碎片看起来棒极了,但是很难使白色碎片具有任何深度而不使它们看起来灰暗。

enter image description here

目前我正在使用:

private readonly Brush _whitePieceBrush = new RadialGradientBrush(Colors.Snow, Colors.Ivory);
private readonly Brush _blackPieceBrush = new RadialGradientBrush(Colors.DarkGray, Colors.Black);

...

using (DrawingContext dc = _piecesVisual.RenderOpen())
{
    ....
    Brush brush = piece.Value.IsBlack ? _blackPieceBrush : _whitePieceBrush;
    var pen = new Pen(new SolidColorBrush(Colors.Black), 0.5); 
    dc.DrawEllipse(brush, pen, new Point(posX, posY), 15, 15);
    ...

}

白色棋子周围的黑圆圈并没有起到什么帮助作用,但是如果没有它们,情况将会更糟糕。如果我能找到一种更好看的画它们的方法,我就会把它们去掉。


2
完成并提交后(这是一个大学项目),我可能会放置源代码和安装程序的链接(将链接到主要帖子)。 - Frames Catherine White
改编自《梦幻田园》的名言:“编译它,他们就会来。” - RhysW
1
环顾办公室,我注意到大多数有深度的白色物品(即所有真实的物品)在其深度的一部分看起来灰色。始终保持白色的部分似乎并没有深度(从颜色上来说 - 显然我可以从透视和其他方面辨别出来)。 - Tim
是的,肯定需要一些灰色,但是到目前为止我使用Colors.Silver进行的实验使它变得太灰了。我认为这完全取决于你如何定义颜色点。 - Frames Catherine White
这可能是为什么有时候人们会选择使用蓝色和红色作为棋子颜色,以避免在白色物体上的灰度。 - RhysW
显示剩余2条评论
2个回答

12

以下是一个类似的示例。 焦点有点偏离中心,我发现这可以提高空间效果。

输入图像描述

<Ellipse Width="60" Height="60">
    <Ellipse.Fill>
        <RadialGradientBrush GradientOrigin="0.3,0.3">
            <RadialGradientBrush.GradientStops>
                <GradientStop Color="White" Offset="0"/>
                <GradientStop Color="White" Offset="0.3"/>
                <GradientStop Color="#FFF0F0F0" Offset="1"/>
            </RadialGradientBrush.GradientStops>
        </RadialGradientBrush>
    </Ellipse.Fill>
</Ellipse>

由于某些原因,对我来说效果不是很好。在我的电脑上有非常明显的条纹。 - Frames Catherine White

2

我尝试过:

    private readonly Brush _whitePieceBrush = new RadialGradientBrush()
    {
        GradientStops = new GradientStopCollection
        {

            new GradientStop(Colors.WhiteSmoke,0.3),
            new GradientStop(Colors.LightGray, 1.0),


        }
    };
    private readonly Brush _whitePieceBorder = new SolidColorBrush(Colors.Silver);

板子图片


采纳Clemens的建议,将它们偏离中心: 稍微偏离中心: 我认为这对黑色更有帮助,但仍然有所改进。

    private static readonly Point _lightSource = new Point(0.3, 0.35);

    private readonly Brush _blackPieceBrush = new RadialGradientBrush(Colors.DarkGray, Colors.Black)
    {
        GradientOrigin = _lightSource
    };
    private readonly Brush _blackPieceBorder = new SolidColorBrush(Colors.Black);

    private readonly Brush _whitePieceBrush = new RadialGradientBrush()
    {
        GradientOrigin = _lightSource,
        GradientStops = new GradientStopCollection
        {

            new GradientStop(Colors.WhiteSmoke,0.3),
            new GradientStop(Colors.LightGray, 1.0),

        }
    };
    private readonly Brush _whitePieceBorder = new SolidColorBrush(Colors.Silver);

enter image description here


看起来很完美。你也试过让它有点偏离中心吗? - Clemens
是的,我做了(实际上是在上传第一张图片后立即完成的)。 - Frames Catherine White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接