3

GLUTを使用せずに、OpenGLでトーラスをレンダリングする必要があります。C#とTaoFrameworkのバインディングを使用しています。ここから取得した次のコードがあります。

 private void DrawTorus() {
        int numc = 100, numt = 100;

        double TWOPI = 2 * Math.PI;
        for (int i = 0; i < numc; i++) {
            Gl.glBegin(Gl.GL_QUAD_STRIP);
            for (int j = 0; j <= numt; j++) {
                for (int k = 1; k >= 0; k--) {

                    double s = (i + k) % numc + 0.5;
                    double t = j % numt;

                    double x = (1 + 0.1 * Math.Cos(s * TWOPI / numc)) * Math.Cos(t * TWOPI / numt);
                    double y = (1 + 0.1 * Math.Cos(s * TWOPI / numc)) * Math.Sin(t * TWOPI / numt);
                    double z = 0.1 * Math.Sin(s * TWOPI / numc);

                    Gl.glVertex3d(2 * x, 2 * y, 2 * z);
                }
            }
            Gl.glEnd();
        }
    }

このコードはトーラスを描画しますが、テクスチャを配置する必要があります。これらの式をテクスチャ座標に使用しようとしていますが、Rとr(それぞれ内側と外側の半径)に何を使用するかがわかりません。

v = arccos (Y/R)/2pi
u = [arccos ((X/(R + r*cos(2pi * v))] * 2pi

そのコードを理解するのに少し苦労しているので、私はそれの説明またはおそらくコメント付きの代替のより直感的なコードをいただければ幸いです。どんな助けでも大歓迎です。

4

1 に答える 1

4

式を比較すると

X = (R + r cos (2 pv)) cos (2 pu)
Y = r sin (2 pv)
Z = (R + r cos (2 pv)) sin (2 pu)

コードで

double x = (1 + 0.1 * Math.Cos(s * TWOPI / numc)) * Math.Cos(t * TWOPI / numt);
double y = (1 + 0.1 * Math.Cos(s * TWOPI / numc)) * Math.Sin(t * TWOPI / numt);
double z = 0.1 * Math.Sin(s * TWOPI / numc);

明らかに、X = x、Y = z、Z = y、R = 1、r = 0.1、2 pv = s * TWOPI / numcおよび2 pu = t * TWOPI / numt。それで

v = arccos (Y/R)/2p
u = [arccos ((X/(R + r*cos(2 pv))]2p

与える

v = arcos (z/1)/TWOPI
u = [arcos ((x/(1 + 0.1*cos(s * TWOPI / numc)]/TWOPI

編集:正直なところ、私は式を理解するために一生懸命努力しませんでした...あなたのコードを読んで、私はこれがトリックをするべきだと思います:

u = (i + k) / (float)numc;
v = t / (float)numt;

(uとvを交換する必要があるかもしれません。)

于 2011-11-01T14:43:19.800 に答える