在c+中构建UV球体+; 我试图用C++在C++中制作一个UV球,我想在不使用OpenGL命令的情况下构建球体。我尝试将顶点添加到lObject,然后添加法线和三角形。球体的半径为1。第一个问题是,绘制时它不会渲染球体,所以可能我没有添加正确的顶点,或者可能我没有正确添加三角形。任何关于我做错了什么的帮助都会很好

在c+中构建UV球体+; 我试图用C++在C++中制作一个UV球,我想在不使用OpenGL命令的情况下构建球体。我尝试将顶点添加到lObject,然后添加法线和三角形。球体的半径为1。第一个问题是,绘制时它不会渲染球体,所以可能我没有添加正确的顶点,或者可能我没有正确添加三角形。任何关于我做错了什么的帮助都会很好,c++,qt,graphics,3d,geometry,C++,Qt,Graphics,3d,Geometry,以下是我尝试过的: NodeObject* ObjectFactory::buildSphere(int slices, int stacks) { // Allocate a new node object NodeObject* lObject = new NodeObject(); for(int i=0; i<stacks; i++) { double lnum1 = 360.0/stacks; double lT

以下是我尝试过的:

NodeObject* ObjectFactory::buildSphere(int slices, int stacks)
{ 
    // Allocate a new node object
    NodeObject* lObject = new NodeObject();

    for(int i=0; i<stacks; i++)
    {
        double lnum1 = 360.0/stacks;
        double lTheta = ((double)i)*(lnum1*(M_PI/180.0));       
        double lNextTheta = ((double)(i+1))*lnum1*(M_PI/180.0);    

        for(int j=0; j<slices; j++)
        {
            double lnum2 = 180.0/slices;
            double lPhi = ((double)i)*(lnum2*(M_PI/180.0));     
            double lNextPhi = ((double)(i+1))*lnum1*(M_PI/180.0);

            lObject->addVertex(0.0, 1.0, 0.0); //Top

            lObject->addVertex(sin(lTheta)*cos(lPhi), sin(lTheta)*sin(lPhi), cos(lTheta));
            lObject->addVertex(sin(lNextTheta)*cos(lNextPhi), sin(lNextTheta)*sin(lNextPhi),    cos(lNextTheta));

            lObject->addVertex(sin(lTheta)*cos(lPhi), -(sin(lTheta)*sin(lPhi)), cos(lTheta));
            lObject->addVertex(sin(lNextTheta)*cos(lNextPhi), -(sin(lNextTheta)*sin(lNextPhi)),              cos(lNextTheta));

            lObject->addVertex(0.0, -1.0, 0.0); //Bottom

            lObject->addNormal(0.0,1.0,0.0);
            lObject->addNormal(0.0,-1.0,0.0);
            lObject->addNormal(sin(lTheta)*cos(lPhi),sin(lTheta)*sin(lPhi), cos(lTheta));

            for(int k=0; k<pSlices*6; k++)
            {
                if(i==0) { lObject->addTriangle(0,1,2,0,0,0); }
                else if(i+1 == stacks) {lObject->addTriangle(2,0,1,0,0,0); }
                else
                {
                    lObject->addTriangle(k, k+1, k+2,k,k+1,k+2);
                }
            }
        }

    }
    return lObject;
}
NodeObject*ObjectFactory::buildSphere(int切片,int堆栈)
{ 
//分配一个新的节点对象
NodeObject*lObject=新的NodeObject();
对于(inti=0;iaddVertex(sin(lTheta)*cos(lPhi),sin(lTheta)*sin(lPhi),cos(lTheta));
lObject->addVertex(sin(lNextTheta)*cos(lNextTheta)、sin(lNextTheta)*sin(lNextTheta)、cos(lNextTheta));
lObject->addVertex(sin(lTheta)*cos(lPhi),-(sin(lTheta)*sin(lPhi)),cos(lTheta));
lObject->addVertex(sin(lNextTheta)*cos(lNextPhi),-(sin(lNextTheta)*sin(lNextPhi)),cos(lNextTheta));
lObject->addVertex(0.0,-1.0,0.0);//底部
lObject->addNormal(0.0,1.0,0.0);
lObject->addNormal(0.0,-1.0,0.0);
lObject->addNormal(sin(lTheta)*cos(lPhi),sin(lTheta)*sin(lPhi),cos(lTheta));
对于(int k=0;kaddTriangle(0,1,2,0,0,0);}
如果(i+1==stacks){lObject->addTriangle(2,0,1,0,0);}
其他的
{
lObject->addTriangle(k,k+1,k+2,k,k+1,k+2);
}
}
}
}
返回对象;
}

在第三个for循环中,pSlices的值是多少?为什么要为每个堆栈添加顶部和底部

为了更好地练习,先生成顶点,然后再做其他事情

您可以使用简单的数据结构来保存数据,例如,也可以在内部循环中生成一层顶点:

QVector3D sphereVertices[stacks][slices];
对于第一层,用(0.0,1.0,0.0)填充; 最后一层填充(0.0,-1.0,0.0)

然后在顶点上迭代以计算法线并在CCW中创建三角形

for ( int i = 0; i < stacks -1; i++){ //-1 is due to we are using the next stack to create the face
    for ( int j = 0; j < slices -1; j++){ //we are also using the next slice
        //Add these vertex indices
        //First triangle indices
        //i*slices + j, (i+1)*slices + j, (i+1)*slices + j + 1
        //Second triangle indices
        //i*slices + j, (i+1)*slices + j + 1, i*slices + j + 1
        //Furthermore you can calculate triangle normal by using these vertices
        //https://www.opengl.org/wiki/Calculating_a_Surface_Normal
    }
}
for(inti=0;i
出了什么问题?请描述您的问题。