在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
出了什么问题?请描述您的问题。