我有一种方法可以根据包含高度,半径和边数的变量创建圆柱。
网格可以在任意数量的边上生成,但是我真的很难理解应该如何对其进行UV映射。
圆柱的每一侧都是一个由两个三角形组成的四边形。 三角形共享顶点。
我认为uv代码的位置正确,但是我不知道什么值合适? 现在,纹理已在网格的所有侧面拉伸/弯曲。 请帮助我理解这一点。
private void _CreateSegmentSides(float height)
{
if(m_Sides > 2) {
float angleStep = 360.0f / (float) m_Sides;
BranchSegment seg = new BranchSegment(m_NextID++);
Quaternion rotation = Quaternion.Euler(0.0f, angleStep, 0.0f);
int index_tr = 0, index_tl = 3, index_br = 2, index_bl = 1;
float u0 = (float)1 / (float) m_Sides;
int max = m_Sides - 1;
// Make first triangles.
seg.vertexes.Add(rotation * (new Vector3(m_Radius, height, 0f)));
seg.vertexes.Add(rotation * (new Vector3(m_Radius, 0f, 0f)));
seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 1]);
seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 3]);
// Add triangle indices.
seg.triangles.Add(index_tr); // 0
seg.triangles.Add(index_bl); // 1
seg.triangles.Add(index_br); // 2
seg.triangles.Add(index_tr); // 0
seg.triangles.Add(index_br); // 2
seg.triangles.Add(index_tl); // 3
seg.uv.Add(new Vector2(0, 0));
seg.uv.Add(new Vector2(0, u0));
seg.uv.Add(new Vector2(u0, u0));
seg.uv.Add(new Vector2(u0, 0));
for (int i = 0; i < max; i++)
{
seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 2]); // new vertex
seg.triangles.Add(seg.vertexes.Count - 1); // new vertex
seg.triangles.Add(seg.vertexes.Count - 2); // shared
seg.triangles.Add(seg.vertexes.Count - 3); // shared
seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 2]); // new vertex
seg.triangles.Add(seg.vertexes.Count - 3); // shared
seg.triangles.Add(seg.vertexes.Count - 2); // shared
seg.triangles.Add(seg.vertexes.Count - 1); // new vertex
// How should I set up the variables for this part??
// I know they are not supposed to be zero.
if (i % 2 == 0) {
seg.uv.Add(new Vector2(0, 0));
seg.uv.Add(new Vector2(0, u0));
} else {
seg.uv.Add(new Vector2(u0, u0));
seg.uv.Add(new Vector2(u0, 0));
}
}
m_Segments.Add(seg);
}
else
{
Debug.LogWarning("Too few sides in the segment.");
}
}
编辑:添加了图片
这是圆柱体的样子(单边三角形):
这是同一着色器(在平面上)的外观:
编辑2:线框图片
答案 0 :(得分:0)
所以您的线框是okey(您仅链接了线框,但我要求阴影线框:这是shaded wireframe但它的okey)。
您的纹理之所以看起来像这样,是因为它试图在任何高度上使图像变暗,因此在高度为1m的圆柱体上看起来可能不错,但是在高度为1000m的圆柱体上看起来可能很好,所以您实际上需要动态地遍历这张uv地图。
高度为1m的圆柱的示例,纹理为okey cos,尺寸为1x1:
高度2m的圆柱体纹理由于长度2x1尺寸的两倍而被拉伸的示例:
因此,您可以做的是,如果始终生成相同高度的圆柱体,则可以在内部统一调整它,在称为贴图的纹理属性下,只需增加纹理的x或y尺寸,别忘了制作纹理重复自己。 另外,您的气瓶盖应该看起来像这样(不是必须的东西,是的):