【发布时间】:2018-11-17 18:37:51
【问题描述】:
所以基本上我有一个带底座的圆柱体(圆柱体下方有一个圆圈),但上面没有圆圈。我想把它做成一个封闭的圆柱体。
这是我的 bool 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);
}
【问题讨论】:
-
M,N是什么?你只需要 2 个圈子......但我什至没有看到任何sin,cos的圈子?通常是将 X,Y 计算为参数圆,Z 是常数(每个基数不同,它们的距离是圆柱体高度) -
...
GetUV是做什么的?为什么是glDrawElements和glDrawArrays?元素列表在哪里? -
抱歉,我编辑了帖子。
标签: c++ opengl graphics 3d glm-math