简体   繁体   中英

WP7 XNA - Only drawing half of my sphere model

I'm having a very strange problem with XNA/OpenGL on Windows Phone 7. I'm drawing a sphere using the following code:

 if (Radius < 0f)
            Radius = -Radius;
        if (Radius == 0f)
            throw new DivideByZeroException("DrawSphere: Radius cannot be 0f.");
        if (Precision == 0)
            throw new DivideByZeroException("DrawSphere: Precision of 8 or greater is required.");

        const float HalfPI = (float)(Math.PI * 0.5);
        float OneThroughPrecision = 1.0f / Precision;
        float TwoPIThroughPrecision = (float)(Math.PI * 2.0 * OneThroughPrecision);

        float theta1, theta2, theta3;
        Vector3 Normal = new Vector3(0,0,0), Position = new Vector3();

        for (uint j = 0; j < Precision / 2; j++)
        {
            theta1 = (j * TwoPIThroughPrecision) - HalfPI;
            theta2 = ((j + 1) * TwoPIThroughPrecision) - HalfPI;

            GL.Begin(BeginMode.TriangleStrip);
            for (uint i = 0; i <= Precision; i++)
            {
                theta3 = i * TwoPIThroughPrecision;

                Normal.X = (float)(Math.Cos(theta2) * Math.Cos(theta3));
                Normal.Y = (float)Math.Sin(theta2);
                Normal.Z = (float)(Math.Cos(theta2) * Math.Sin(theta3));
                Position.X = Center.X + Radius * Normal.X;
                Position.Y = Center.Y + Radius * Normal.Y;
                Position.Z = Center.Z + Radius * Normal.Z;

                GL.Normal3(Normal);
                GL.TexCoord2(i * OneThroughPrecision, 2.0f * (j + 1) * OneThroughPrecision);
                GL.Vertex3(Position);

                Normal.X = (float)(Math.Cos(theta1) * Math.Cos(theta3));
                Normal.Y = (float)Math.Sin(theta1);
                Normal.Z = (float)(Math.Cos(theta1) * Math.Sin(theta3));
                Position.X = Center.X + Radius * Normal.X;
                Position.Y = Center.Y + Radius * Normal.Y;
                Position.Z = Center.Z + Radius * Normal.Z;

                GL.Normal3(Normal);
                GL.TexCoord2(i * OneThroughPrecision, 2.0f * j * OneThroughPrecision);
                GL.Vertex3(Position);
            }
            GL.End();
        }

The sphere ends up looking like this (on BOTH the emulator AND the device (HTC HD7): 奇怪的球体
Any suggestions?

Try using this . Since it's more of an OpenGL issue than Android, try looking up an algorithm for manual sphere generation. It might be worthwhile to check if vertex order is correct as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM