C++ 使用四边形绘制球体的算法
我正在尝试使用OpenGL从头开始绘制球体。函数必须定义为C++ 使用四边形绘制球体的算法,c++,opengl,shapes,normals,C++,Opengl,Shapes,Normals,我正在尝试使用OpenGL从头开始绘制球体。函数必须定义为void drawSphere(浮动半径、整数分段、整数分段),必须以(0,0,0)原点为中心,并且必须使用GL_QUADS创建 首先,“切片”是指堆叠在一起以创建球体的锥形圆柱体形状,而“分段”是指在圆中生成的四边形,以生成每个锥形圆柱体切片的壁/侧 其次,我似乎找不到任何算法或例子来说明如何使用四边形来生成这个球体——大多数例子似乎是从三角形生成的 编辑 这是我刚才试过的,方向肯定是对的,但我的坐标计算出了偏差: void drawS
void drawSphere(浮动半径、整数分段、整数分段)
,必须以(0,0,0)原点为中心,并且必须使用GL_QUADS
创建
首先,“切片”是指堆叠在一起以创建球体的锥形圆柱体形状,而“分段”是指在圆中生成的四边形,以生成每个锥形圆柱体切片的壁/侧
其次,我似乎找不到任何算法或例子来说明如何使用四边形来生成这个球体——大多数例子似乎是从三角形生成的
编辑
这是我刚才试过的,方向肯定是对的,但我的坐标计算出了偏差:
void drawSphere(float radius, int nSegments, int nSlices) {
/*
* TODO
* Draw sphere centered at the origin using GL_QUADS
* Compute and set normal vectors for each vertex to ensure proper shading
* Set texture coordinates
*/
for (float slice = 0.0; slice < nSlices; slice += 1.0) {
float lat0 = M_PI * (((slice - 1) / nSlices) - 0.5);
float z0 = sin(lat0);
float zr0 = cos(lat0);
float lat1 = M_PI * ((slice / nSlices) - 0.5);
float z1 = sin(lat1);
float zr1 = cos(lat1);
glBegin(GL_QUADS);
for (float segment = 0.0; segment < nSegments; segment += 1.0) {
float long0 = 2 * M_PI * ((segment -1 ) / nSegments);
float x0 = cos(long0);
float y0 = sin(long0);
float long1 = 2 * M_PI * (segment / nSegments);
float x1 = cos(long1);
float y1 = sin(long1);
glVertex3f(x0 * zr0, y0 * zr0, z0);
glVertex3f(x1 * zr1, y1 * zr1, z0);
glVertex3f(x0 * zr0, y0 * zr0, z1);
glVertex3f(x1 * zr1, y1 * zr1, z1);
}
glEnd();
}
}
void drawSphere(浮动半径、整数分段、整数分段){
/*
*待办事项
*使用GL_四边形以原点为中心绘制球体
*计算并设置每个顶点的法向量,以确保正确着色
*设置纹理坐标
*/
对于(浮动片=0.0;片我没有看到使用半径。可能是一个简单的遗漏。假设在剩下的计算中,半径为1。您应该在(x,y)和(z,zr)上使用0-1来生成4个值,但不能在这些元组中混合使用
所以x1*zr1,y1*zr1,z0
是不对的,因为你把zr1
和z0
混在一起了。你可以看到这个向量的范数不再是1。你的4个价值观应该是
x0 * zr0, y0 * zr0, z0
x1 * zr0, y1 * zr0, z0
x0 * zr1, y0 * zr1, z1
x1 * zr1, y1 * zr1, z1
我对订单不是很确定,因为我不使用四边形,而是三角形。谢谢。我只需要玩弄一下订单就能让它工作。另外,谢谢你发现我从未调整过半径x0
、x1
、y0
和y1
都必须乘以半径