1

私はポリゴンなどをいじっているだけで、独自の回転可能な立方体を作成しようと決心し、各「ポリゴン」に8つの頂点を持つ6つの異なる側面を生成することでこれを達成することにしました. (立方体の遠近法に合うように傾けることができる正方形です。LWJGL などのような「クワッド」メソッドは見つかりませんでした)問題; 塗装順です。コードを 1 行ずつ下っていくときに描画される「順序」があることは理解していますが、私のコードを見ると、この効果が得られないように順序を変更できると思いますか? 「キューブ」をレンダリングすると:

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 }
    };

次に、ご存知の数学を使用して回転させます。等角投影ビューを使用すると、どの 3 つの面が同じ角を持っているかを特定できれば、表示される 3 つの面が最大の z 値 (画面から外側に向かって) を持つため、どの面が表示されるかを簡単に見つけることができます。それらを描くことができます。

あなたが遭遇する1つのことは、2つの点がある場合(つまり、1つの軸でのみ回転していることを意味します)、2つの点が最大のz値を持つことです。次に、それらの 2 点が共有する面を描くだけです。

最後のケースは、4 つの点が同じ最大 z 値を共有している場合、それらの 4 つの点を持つ面だけが描画される必要がある面です。

編集:配列を3次元にするのを忘れていました

于 2013-07-30T00:52:23.500 に答える