0

三角形ストリップの法線を計算する必要があり、他のすべての三角形が暗く、うまくシェーディングされていないという問題があります。フラットシェードモデルを使用しています。巻く方向と関係があるのか​​はわかりません。三角形のストリップの下を見ると、暗い領域または切り替えられた部分を除いて、トップと同じであることに気付きます。問題は、計算しようとしている表面法線が共有頂点を使用していることだと思います。その場合、GL_TRIANGLES に切り替えることをお勧めしますか? これをどのように解決しますか?

これが私が今持っているものです。三角形クラスには、3 つの Vert オブジェクトを持つ triVerts 配列があります。Vert オブジェクトには変数 x、y、および z があります。

   Triangle currentTri = new Triangle();
   int triPointIndex = 0;
   List<Triangle> triList = new ArrayList<Triangle>()                               

    GL11.glBegin(GL11.GL_TRIANGLE_STRIP);
            int counter1 = 0;               
            float stripZ = 1.0f;
            float randY;
            for (float x=0.0f; x<20.0f; x+=2.0f) {
                if (stripZ == 1.0f) {
                    stripZ = -1.0f;
                } else { stripZ = 1.0f; }

                randY = (Float) randYList.get(counter1);
                counter1 += 1;

                GL11.glVertex3f(x, randY, stripZ);

                Vert currentVert = currentTri.triVerts[triPointIndex];
                currentVert.x = x;
                currentVert.y = randY;
                currentVert.z = stripZ;

                triPointIndex++;

                System.out.println(triList);

                Vector3f normal = new Vector3f();
                float Ux = currentTri.triVerts[1].x - currentTri.triVerts[0].x;
                float Uy = currentTri.triVerts[1].y - currentTri.triVerts[0].y;
                float Uz = currentTri.triVerts[1].z - currentTri.triVerts[0].z;

                float Vx = currentTri.triVerts[2].x - currentTri.triVerts[0].x;
                float Vy = currentTri.triVerts[2].y - currentTri.triVerts[0].y;
                float Vz = currentTri.triVerts[2].z - currentTri.triVerts[0].z;

                normal.x = (Uy * Vz) - (Uz * Vy);
                normal.y = (Uz * Vx) - (Ux * Vz);
                normal.z = (Ux * Vy) - (Uy * Vx);

                GL11.glNormal3f(normal.x, normal.y, normal.z);

                if (triPointIndex == 3) {
                    triList.add(currentTri);
                    Triangle nextTri = new Triangle();

                    nextTri.triVerts[0] = currentTri.triVerts[1];
                    nextTri.triVerts[1] = currentTri.triVerts[2];
                    currentTri = nextTri;
                    triPointIndex = 2;
                }           

            }
     GL11.glEnd();
4

1 に答える 1

0

約 8 ~ 10 個の面といくつかの照明を備えたピラミッドを描く必要があり、適切に照明するために三角形を使用しました。三角形ごとに、法線を計算する必要がありました。このように機能しました。また、各三角形の頂点を描く時計回り/反時計回りの感覚を保つことも重要だと思います。お役に立てば幸いです。

于 2013-12-04T09:48:26.160 に答える