1

我只是在玩弄多边形和其他东西,并决定尝试制作自己的可旋转立方体,我决定通过在每个“多边形”上生成 6 个不同的边和 8 个顶点来实现这一点。(只是一个可以倾斜以适应立方体透视的正方形 - 我还没有找到像 LWJGL 或其他任何“四边形”方法)我知道这可能不是最好的方法,因为我遇到了问题; 油漆顺序。我知道有一个“顺序”,当它们逐行沿着代码向下时,它们会被绘制,但是看看我的代码,你有什么办法认为我可以改变顺序而不是得到这种效果当我渲染我的“立方体”时:

http://i.stack.imgur.com/3MdT2.png

我用不同的颜色为每一面着色,正如你所见,结果非常糟糕。通常,如果我只是要渲染一个无法移动的 2D 立方体,我会制作绘制顺序,这样就不会发生这种情况,但是因为我想旋转和移动它,所以我会说这样做毫无意义.

这是我的代码,任何帮助将不胜感激,谢谢!(忽略我使用小程序来做这件事的事实,我只是在测试......)

package advanced;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class rotatingCube extends Applet implements Runnable {

private static final long serialVersionUID = -5353063756246119245L;

    int[][] vertex = {
            { 50, 50 }, { 100, 50 }, { 100, 100 }, { 50, 100 }, 
            { 75, 75 }, { 125, 75 }, { 125, 125 }, { 75, 125 }
    };

    int[]   Xpoly1={ vertex[0][0], vertex[1][0], vertex[2][0], vertex[3][0] },
            Ypoly1={ vertex[0][1], vertex[1][1], vertex[2][1], vertex[3][1] },

            Xpoly2={ vertex[4][0], vertex[5][0], vertex[6][0], vertex[7][0] },
            Ypoly2={ vertex[4][1], vertex[5][1], vertex[6][1], vertex[7][1] },

            Xpoly3={ vertex[5][0], vertex[1][0], vertex[2][0], vertex[6][0] },
            Ypoly3={ vertex[5][1], vertex[1][1], vertex[2][1], vertex[6][1] },

            Xpoly4={ vertex[4][0], vertex[0][0], vertex[3][0], vertex[7][0] },
            Ypoly4={ vertex[4][1], vertex[0][1], vertex[3][1], vertex[7][1] },

            Xpoly5={ vertex[3][0], vertex[2][0], vertex[6][0], vertex[7][0] },
            Ypoly5={ vertex[3][1], vertex[2][1], vertex[6][1], vertex[7][1] },

            Xpoly6={ vertex[0][0], vertex[1][0], vertex[5][0], vertex[4][0] },
            Ypoly6={ vertex[0][1], vertex[1][1], vertex[5][1], vertex[4][1] };

public void start() {
    setSize(500, 500);
    new Thread(this).start();
}

public void run() {

}

public void paint(Graphics e) {
    Graphics2D g = (Graphics2D) e;

    g.setColor(Color.RED);
    g.fillPolygon(Xpoly1, Ypoly1, 4);
    g.setColor(Color.GREEN);
    g.fillPolygon(Xpoly2, Ypoly2, 4);
    g.setColor(Color.BLUE);
    g.fillPolygon(Xpoly3, Ypoly3, 4);
    g.setColor(Color.YELLOW);
    g.fillPolygon(Xpoly4, Ypoly4, 4);
    g.setColor(Color.ORANGE);
    g.fillPolygon(Xpoly5, Ypoly5, 4);
    g.setColor(Color.PINK);
    g.fillPolygon(Xpoly6, Ypoly6, 4);
}
}
4

2 回答 2

1

这是如何绘制以供分析参考:

public void paint(Graphics e) {
    Graphics2D g = (Graphics2D) e;

    // red blue and orange are all hidden behind the other faces so you don't draw them
    // but if you did you just need to draw them first and the order doesn't matter
    // since they don't overlap
    //g.setColor(Color.RED);
    //g.fillPolygon(Xpoly1, Ypoly1, 4);
    //g.setColor(Color.BLUE);
    //g.fillPolygon(Xpoly3, Ypoly3, 4);
    //g.setColor(Color.ORANGE);
    //g.fillPolygon(Xpoly5, Ypoly5, 4);

    // since these three don't overlap you can draw them in any order as well.
    g.setColor(Color.PINK);
    g.fillPolygon(Xpoly6, Ypoly6, 4);
    g.setColor(Color.YELLOW);
    g.fillPolygon(Xpoly4, Ypoly4, 4);
    g.setColor(Color.GREEN);
    g.fillPolygon(Xpoly2, Ypoly2, 4);
}

无论如何,这就是你想要发生的事情吗?

您为立方体制作顶点的方式不足以弄清楚如何做到这一点。您需要提供 3d 坐标。

很喜欢

int[][][] vertex = {
            { 0, 0, 0 }, { 100, 0, 0 }, { 100, 100, 0 }, { 0, 100, 0 }, 
            { 100, 100, 100}, { 0, 100, 100}, { 0, 0, 100}, { 100, 0, 100 }
    };

然后用你知道的数学旋转它。现在,如果您使用等轴测视图,您可以轻松找出将显示哪些面,因为可见的三个面将具有最大的 z 值(从屏幕向外朝向您)如果您可以确定哪些三个面具有相同的角,那么您可以画出来。

您会遇到的一件事是,如果有两个点(意味着它仅在一个轴上旋转),则两个点将具有最高的 z 值。然后你只需画出这两个点共有的面。

最后一种情况是,如果 4 个点共享相同的最大 z 值,则具有这四个点的面将是唯一需要绘制的面。

编辑:忘记制作3维数组

于 2013-07-30T00:52:23.500 回答
1

在不给你所有代码的情况下,这类事情的一般算法是

  1. 将每个多边形(最好是三角形,但也可以是四边形)表示为某种对象,包括坐标索引和颜色
  2. 将所有多边形存储在一个数组中
  3. 根据数组的z 顺序(即与相机平面的距离)以从后到前的顺序对数组进行排序。通常,您使用每个多边形的质心(在转换后的 3 维坐标中)或仅使用最近的 z 值顶点的位置。
  4. 编写一个简单的循环,按顺序从数组中绘制每个多边形。

这被称为“画家算法”,它适用于由近等边三角形构成的实体。一旦你进入高度锐角的三角形(长尖的三角形),就不可能进行有意义的 z 顺序排序,并且你会得到视觉伪影,因为重叠是错误的。但是对于一个立方体,如果你用两个 45-45-90 的三角形来表示每个四边形,它就可以很好地工作。

于 2013-07-30T01:11:07.390 回答