C++ OpenGL VBOs:绘制球体

C++ OpenGL VBOs:绘制球体,c++,opengl,geometry,vbo,C++,Opengl,Geometry,Vbo,我画一个球体有点困难 std::vector<GLfloat> ballVerts; for(int i = 0; i <= 40; i++) { double lat0 = M_PI * (-0.5 + (double) (i - 1) / 40); double z0 = sin(lat0); double zr0 = cos(lat0); double lat1 = M_PI * (-0.5 + (double) i / 40);

我画一个球体有点困难

std::vector<GLfloat> ballVerts;

for(int i = 0; i <= 40; i++)
{
    double lat0 = M_PI * (-0.5 + (double) (i - 1) / 40);
    double z0  = sin(lat0);
    double zr0 =  cos(lat0);

    double lat1 = M_PI * (-0.5 + (double) i / 40);
    double z1 = sin(lat1);
    double zr1 = cos(lat1);

    for(int j = 0; j <= 40; j++)
    {
        double lng = 2 * M_PI * (double) (j - 1) / 40;
        double x = cos(lng);
        double y = sin(lng);

        ballVerts.push_back(x * zr0); //X
        ballVerts.push_back(y * zr0); //Y
        ballVerts.push_back(z0);      //Z

        ballVerts.push_back(0.0f); 
        ballVerts.push_back(1.0f); 
        ballVerts.push_back(0.0f); 
        ballVerts.push_back(1.0f); //R,G,B,A

        ballVerts.push_back(x * zr1); //X
        ballVerts.push_back(y * zr1); //Y
        ballVerts.push_back(z1);      //Z

        ballVerts.push_back(0.0f); 
        ballVerts.push_back(1.0f); 
        ballVerts.push_back(0.0f); 
        ballVerts.push_back(1.0f); //R,G,B,A
    }
}

glGenBuffers(1, &ballVbo);
glBindBuffer(GL_VERTEX_ARRAY, ballVbo);

GLuint sphereSize = 3200*7*4; //3200 vertixes * 7 floats
glBufferData(GL_VERTEX_ARRAY,sphereSize, &ballVerts, GL_STATIC_DRAW);



/*
    Draw a ball
*/
glBindBuffer(GL_VERTEX_ARRAY, ballVbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 7*4, 0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 7*4, (void*)(3*4));

glDrawArrays(GL_TRIANGLE_STRIP, 0, 3200);

glBindBuffer(GL_ARRAY_BUFFER, 0);
std::向量鲍尔弗特;
对于(int i=0;i

ballVerts
不是数组。它是一个
std::vector
。获取
std::vector
的地址不会得到
vector
中包含的数组的地址。您需要使用
和ballVerts[0]

最好预先调整向量的大小,并使用迭代器对其进行扫描 大概是这样的:

 std::vector <GLfloat> vertices;
 vertices.resize(count * 3);
 ...
 std::vector <GLfloat>::iterator v = vertices.begin();

 for( U32 r = 0; r < m_prec/2; ++r ) //широта
    {
        float const theta1 = -F_PI_BY_TWO + pi2p * r;
        float const theta2 = theta1 +  pi2p;

        for( U32 s = 0; s < m_prec; ++s ) //долгота
        {
            float const theta3 =  s * pi2p;     

            float ex = cosf(theta3) *cosf(theta2);
            float ey = sinf(theta2);
            float ez = sinf(theta3) * cosf(theta2);
            *v++ = m_x + m_radius * ex;
            *v++ = m_y + m_radius * ey;
            *v++ = m_z + m_radius * ez;
std::向量顶点;
顶点。调整大小(计数*3);
...
std::vector::iterator v=顶点。begin();
对于(U32 r=0;r
等等

::glVertexPointer(3,GL_FLOAT,0,&顶点[0])


如果你能访问C++11,你也可以使用std::vector的.data()方法。我相信,这可以避免在空数组上使用address运算符的问题。它真的有效吗?为什么我要在中间模式下尝试代码,它只会给我一个圆?同样,当我尝试使用glBegin(GLU点)时取而代之的是,它只会给我一个圆的点。。
 std::vector <GLfloat> vertices;
 vertices.resize(count * 3);
 ...
 std::vector <GLfloat>::iterator v = vertices.begin();

 for( U32 r = 0; r < m_prec/2; ++r ) //широта
    {
        float const theta1 = -F_PI_BY_TWO + pi2p * r;
        float const theta2 = theta1 +  pi2p;

        for( U32 s = 0; s < m_prec; ++s ) //долгота
        {
            float const theta3 =  s * pi2p;     

            float ex = cosf(theta3) *cosf(theta2);
            float ey = sinf(theta2);
            float ez = sinf(theta3) * cosf(theta2);
            *v++ = m_x + m_radius * ex;
            *v++ = m_y + m_radius * ey;
            *v++ = m_z + m_radius * ez;