WP7 XNA - 仅绘制我的球体模型的一半

时间:2011-04-08 01:42:37

标签: c# opengl windows-phone-7 3d

我在Windows Phone 7上遇到一个非常奇怪的XNA / OpenGL问题。我正在使用以下代码绘制一个球体:

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

球体最终看起来像这样(在仿真器和设备(HTC HD7)上): Strange sphere
有什么建议吗?

1 个答案:

答案 0 :(得分:0)

尝试使用this。由于它比Android更多的是OpenGL问题,因此请尝试查找手动球体生成算法。检查顶点顺序是否正确可能是值得的。