1

球の正しいマッピングに問題があります。私は世界地図を使用して、どこがうまくいかないかを示しました。北アメリカは上から下に向かって正面に表示されますが、南アメリカは反対側に逆さまに表示され、アジアのような大陸は地図上にさえありません。

スクリーンショット
(ソース:troll.ws

以下のコードは球体オブジェクトです

class Shape {
    
    public void drawSphere(double radius, int slices, int stacks) {
        gl.glEnable(GL_TEXTURE_2D);
        head.bind(gl); //Method that binds the world-map (for testing) texture.
        gl.glBegin(GL_QUADS);
        double stack = (2 * PI) / stacks;
        double slice = (2 * PI) / slices;
        for (double theta = 0; theta < 2 * PI; theta += stack) {
            for (double phi = 0; phi < 2 * PI; phi += slice) {
                Vector p1 = getPoints(phi, theta, radius);
                Vector p2 = getPoints(phi + slice, theta, radius);
                Vector p3 = getPoints(phi + slice, theta + stack, radius);
                Vector p4 = getPoints(phi, theta + stack, radius);
                double s0 = theta / (2 * PI);
                double s1 = (theta + stack) / (2 * PI);
                double t0 = phi / (2 * PI);
                double t1 = (phi + slice) / (2 * PI);
                                                      
                vectorToNormal(norm(p1));
                gl.glTexCoord2d(s0, t0);
                vectorToVertex(p1);
                
                vectorToNormal(norm(p2));
                gl.glTexCoord2d(s0, t1);
                vectorToVertex(p2);
                
                vectorToNormal(norm(p3));
                gl.glTexCoord2d(s1, t1 );
                vectorToVertex(p3);
                
                vectorToNormal(norm(p4));
                gl.glTexCoord2d(s1, t0);
                vectorToVertex(p4);
            }
        }
        gl.glEnd();
        gl.glDisable(GL_TEXTURE_2D);
    }
    
    Vector getPoints(double phi, double theta, double radius) {
        double x = radius * cos(theta) * sin(phi);
        double y = radius * sin(theta) * sin(phi);
        double z = radius * cos(phi);
        return new Vector(x, y, z);
    }

どうすれば修正できますか?座標などを入れ替えてみましたが、それでも面倒くさいです。

また、テクスチャをバインドすると、スペールにアーティファクトが発生するようです。それは修正可能ですか?

4

2 に答える 2

3

両方のループは0から2*PIになります。それらの1つは半円のみである必要があります。球体を2倍にした結果、危険なマッピングと奇妙なアーティファクトが発生しました。

于 2012-12-23T20:45:35.490 に答える
1

JasonDのおかげで、これで修正されました。

for (double theta = 0; theta < 2 * PI; theta += stack) {
    for (double phi = 0; phi < 1 * PI; phi += slice) {
        Vector p1 = getPoints(phi, theta, radius);
        Vector p2 = getPoints(phi + slice, theta, radius);
        Vector p3 = getPoints(phi + slice, theta + stack, radius);
        Vector p4 = getPoints(phi, theta + stack, radius);
        double s0 = theta / (2 * PI);
        double s1 = (theta + stack) / (2 * PI);
        double t0 = phi / (1 * PI);
        double t1 = (phi + slice) / (1 * PI);
于 2012-12-23T20:56:11.677 に答える