c# - 绘制 3D 风格效果时遇到问题

标签 c# .net gdi+

我一直在绞尽脑汁试图找出如何制作动画效果。这与我在 math.stackexchange.com 上提出的一个问题有关。

https://math.stackexchange.com/questions/91120/equal-division-of-rectangles-to-make-total/

顺便说一句,我没有实现上述问题中定义的绘图算法,而是使用我自己的算法来改变视角,使其看起来更加简洁。

我已经能够绘制静止的 3D 风格效果,但我无法将我的大脑围绕逻辑进行思考,以使下面的线条看起来像是朝您走来。

enter image description here

我的代码如下,

        List<double> sizes = new List<double>();
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int y = 1; y < 10; y++)
            {
                double s = ((240 / 2) / y) / 4;
                sizes.Add(s);
            }
            sizes.Add(0);
        }

        int offset = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap b = new Bitmap(320, 480);
            Graphics g = Graphics.FromImage(b);

            Color firstColor = Color.DarkGray;
            Color secondColor = Color.Gray;    
            Color c = firstColor;

            int yOffset = 0;
            for(int i = 0; i < sizes.Count; i++)
            {
                c = (i % 2 == 0) ? firstColor : secondColor;

                int y = (int)Math.Round(b.Height - yOffset - sizes[i]);
                int height = (int)Math.Round(sizes[i]);

                g.FillRectangle(new SolidBrush(c), new Rectangle(0, y + offset, b.Width, height + offset));
                yOffset += (int)sizes[i];
            }

            this.BackgroundImage = b;
            offset+=1;
        }

每次单击按钮都会导致矩形调整大小并靠近。但是,我的矩形没有按应有的方式增长。我的逻辑画得很好,但就移动而言根本行不通。

所以我的问题是:

是否存在我不知道的这种效果的现有算法,或者这是我想太多的非常简单的东西?任何帮助纠正我的逻辑或为我指明正确方向的帮助都将非常感激。

最佳答案

有趣...

(此处的答案视频:http://youtu.be/estq62yz7v0)

我会这样做:

首先,删除所有矩形绘图并逐行绘制效果。就像这样:

for (int y=start;y<end;y++) 
{
    color = DetermineColorFor(y-start);
    DrawLine(left, y, right, y, color);
}

这当然是伪代码,不会受到 GDI+ 或其他东西的困扰。

这里一切都很清楚,除了如何编写 DetermineColorFor() 方法。该方法必须返回指定投影高度处线条的颜色。 projection diagram

现在,在图片上,您有:

  • 您的观点 (X) - 不知道如何画眼睛
  • 红线(即您的屏幕 - 投影平面)
  • 您的背景(底部交替条纹)
  • 以及一些可以帮助您设计 DetermineColorFor() 方法的投影线

提示 - 使用三角形相似度从屏幕坐标转到“条形”坐标。
下一个提示 - 当您处于“条”坐标时,使用模运算符来确定颜色。

如果需要,我会添加更多提示,但如果您自己解决这个问题,那就太好了。


我受到这个问题的启发,并为解决方案创建了代码。这是:

int _offset = 0;
double period = 20.0;
private void timer1_Tick(object sender, EventArgs e)
{
    for (int y = Height / 3; y < Height; y++)
    {
        using (Graphics g = CreateGraphics())
        {
            Pen p = new Pen(GetColorFor(y - Height / 3));
            g.DrawLine(p, 0, y, Width, y);
            p.Dispose();
        }
    }
    _offset++;
}

private Color GetColorFor(int y)
{
    double d = 10.0;
    double h = 20.0;
    double z = 0.0;
    if (y != 0)
    {
        z = d * h / (double)y + _offset;
    }
    double l = 128 + 127 * Math.Sin(z * 2.0 * Math.PI / period);
    return Color.FromArgb((int)l, (int)l, (int)l);
}

实验:

  • d - 眼睛到投影屏幕的距离
  • h - 眼睛距“栏”的高度
  • 句点 - “栏”上的条纹宽度

我在表单上有一个计时器,并且事件已正确连接。定时器持续时间为 20ms。

关于c# - 绘制 3D 风格效果时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506788/

相关文章:

c# - 如何从 RDL 文件中的语义查询中获取物理 SQL 查询?

c++ - 如何检查 jpeg 是 RGB 还是 CMYK 格式?

Windows:从其他字体获取替换字符的字形轮廓

c# - 在 TFS 中,如何使用 C# 代码检查文件是否最新?

c# - ThrowIfCancellationRequested 似乎没有抛出任何异常

c# - 日期时间字符串格式和 CultureInfo

c# - 从 SmtpClient 获取 SMTP 服务器问候消息

c# - 评估 DBNull : checking for equality or using the 'is' operator?

text - 如何绘制独立于 DPI 的 GDI + 文本

c# - 在具有物理和刚体的移动物体上与玩家保持一致在 Unity 中不起作用