Sylinder
원주 좌표를 활용해서 그려준다.
MeshCylinder.cpp
void MeshCylinder::Create()
{
vector<MeshVertex> v;
float stackHeight = height / (float)stackCount;
float radiusStep = (topRadius - bottomRadius) / (float)stackCount;
UINT ringCount = stackCount + 1;
for (UINT i = 0; i < ringCount; i++)
{
float y = -0.5f * height + i * stackHeight;
float r = bottomRadius + i * radiusStep;
float theta = 2.0f * Math::PI / (float)sliceCount;
for (UINT k = 0; k <= sliceCount; k++)
{
float c = cosf(k * theta);
float s = sinf(k * theta);
MeshVertex vertex;
vertex.Position = Vector3(r * c, y, r * s);
vertex.Uv = Vector2((float)k / (float)sliceCount, 1.0f - (float)i / (float)stackCount);
Vector3 tangent = Vector3(-s, 0.0f, c);
float dr = bottomRadius - topRadius;
Vector3 biTangent = Vector3(dr * c, -height, dr * s);
D3DXVec3Cross(&vertex.Normal, &tangent, &biTangent);
D3DXVec3Normalize(&vertex.Normal, &vertex.Normal);
v.push_back(vertex);
}
}
vector<UINT> i;
UINT ringVertexCount = sliceCount + 1;
for (UINT y = 0; y < stackCount; y++)
{
for (UINT x = 0; x < sliceCount; x++)
{
i.push_back(y * ringVertexCount + x);
i.push_back((y + 1) * ringVertexCount + x);
i.push_back((y + 1) * ringVertexCount + (x + 1));
i.push_back(y * ringVertexCount + x);
i.push_back((y + 1) * ringVertexCount + x + 1);
i.push_back(y * ringVertexCount + x + 1);
}
}
BuildTopCap(v, i);
BuildBottomCap(v, i);
vertices = new MeshVertex[v.size()];
vertexCount = v.size();
copy(v.begin(), v.end(), stdext::checked_array_iterator<MeshVertex *>(vertices, vertexCount));
indices = new UINT[i.size()];
indexCount = i.size();
copy(i.begin(), i.end(), stdext::checked_array_iterator<UINT *>(indices, indexCount));
}
각 x,y,z의 정점을 원주좌표계를 활용해서 높이만큼 점을 찍는다.
void MeshCylinder::BuildTopCap(vector<MeshVertex>& vertices, vector<UINT>& indices)
{
float y = 0.5f * height;
float theta = 2.0f * Math::PI / (float)sliceCount;
for (UINT i = 0; i <= sliceCount; i++)
{
float x = topRadius * cosf(i * theta);
float z = topRadius * sinf(i * theta);
float u = x / height + 0.5f;
float v = z / height + 0.5f;
vertices.push_back(MeshVertex(x, y, z, u, v, 0, 1, 0));
}
vertices.push_back(MeshVertex(0, y, 0, 0.5f, 0.5f, 0, 1, 0));
UINT baseIndex = vertices.size() - sliceCount - 2;
UINT centerIndex = vertices.size() - 1;
for (UINT i = 0; i < sliceCount; i++)
{
indices.push_back(centerIndex);
indices.push_back(baseIndex + i + 1);
indices.push_back(baseIndex + i);
}
}
(위아래 변수 이름만 빼고 같다) 그다음 원의 정점을 구한다음 찍어준다.
이렇게 하면
잘 나온다.
이것도
수 많은 삼각형으로 되어있다.