所以基本上我有一个带底的圆柱(圆柱下方有一个圆),但上方没有圆。我想把它做成一个封闭的圆柱体。
这是我的 bool(boolean) CMyApp::Init()函数的重要部分:
Vertex vert[(N+1)*(M+1) + N+2]; //NxM rectangle for our parametric equation
for (int i=0; i<=N; ++i)
for (int j=0; j<=M; ++j)
{
float u = i/(float)N;
float v = j/(float)M;
vert[i + j*(N+1)].p = GetUV(u, v);
vert[i + j*(N+1)].c = glm::normalize( vert[i + j*(N+1)].p );
}
vert[(N + 1)*(M + 1)].p = glm::vec3(0, 0, 0); //center point for cone base
vert[(N + 1)*(M + 1)].c = glm::vec3(0, 0, 0);
for (int i = 0; i <= N; i++) {
vert[(N + 1)*(M + 1) + 1 + i].p = vert[(N)-i].p; //cone base
vert[(N + 1)*(M + 1) + 1 + i].c = vert[(N)-i].c;
}
渲染功能:
glDrawElements( GL_TRIANGLES,
3*2*(N)*(M),
GL_UNSIGNED_SHORT,
0);
glDrawArrays(GL_TRIANGLE_FAN, (N + 1)*(M + 1) + 1, (N + 2)); //draw cone base
之所以有“圆锥底”,是因为我是从“绘制圆锥体”项目开始的。
我如何在圆柱体上方第二个圆?
编辑:
M,N:常量数(20和10)
我的参数方程式(这是一个称为GetUV()的函数):
u *= 2*3.1415f;
float cu = cosf(u), su = sinf(u), cv = cosf(v), sv = sinf(v);
float M = 2.f;
float r = 0.5;
float m = v*M;
return glm::vec3(r*sinf(u), m, r*cosf(u));
我如何创建索引(在Init()函数内部):
GLushort indices[3*2*(N)*(M)];
for (int i=0; i<N; ++i)
for (int j=0; j<M; ++j)
{
indices[6*i + j*3*2*(N) + 0] = (i) + (j)* (N+1);
indices[6*i + j*3*2*(N) + 1] = (i+1) + (j)* (N+1);
indices[6*i + j*3*2*(N) + 2] = (i) + (j+1)*(N+1);
indices[6*i + j*3*2*(N) + 3] = (i+1) + (j)* (N+1);
indices[6*i + j*3*2*(N) + 4] = (i+1) + (j+1)*(N+1);
indices[6*i + j*3*2*(N) + 5] = (i) + (j+1)*(N+1);
}
最佳答案
绘制另一个圆形盖的最简单方法是只更改圆的模型矩阵,然后再次进行绘制调用。因此,如果您在调用glDrawArrays()
之前正在做这样的事情:
glm::mat4 modelViewMatrix = calculateModelViewMatrix();
glUniformMatrix4fv(modelViewLocation, 1, FALSE, modelViewMatrix);
做同样的事情,但是翻译
modelViewMatrix
,使其在圆柱体的另一端。关于c++ - C++ OpenGL:如何在圆柱上做第二个圆?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53354308/