绘制一个简单圆柱--4面渲染

public int n = 20;//角的个数

public float r = 0.5f;//半径

void Start()

{

Mesh mesh = new Mesh();

VertexHelper vh = new VertexHelper();

float ang = 2 * Mathf.PI / n; //弧度

//面1

vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0.5f, 0.5f));

for (int i = 0; i < n; i++)

{

float x = Mathf.Sin(ang * i) * r;

float y = Mathf.Cos(ang * i) * r;

float uvx = (x + r) / (2 * r);

float uvy = (y + r) / (2 * r);

//做点

vh.AddVert(new Vector3(x, 1, y), Color.white, new Vector2(uvx, uvy));

if (i == 0)

{

//收尾

vh.AddTriangle(0, n, 1);

}

else

{

vh.AddTriangle(0, i, i + 1);

}

}

//面2

int next = 1 + n;

vh.AddVert(new Vector3(0, -1, 0), Color.white, new Vector2(0.5f, 0.5f));

for (int i = 0; i < n; i++)

{

float x = Mathf.Sin(ang * i) * r;

float y = Mathf.Cos(ang * i) * r;

float uvx = (x + r) / (2 * r);

float uvy = (y + r) / (2 * r);

vh.AddVert(new Vector3(x, -1, y), Color.white, new Vector2(uvx, uvy));

if (i == 0)

{

vh.AddTriangle(0 + next, 1 + next, n + next);

}

else

{

vh.AddTriangle(0 + next, i + 1 + next, i + next);

}

}

//面3

next = (1 + n) * 2;

float nn = (float) n / 2;

int num = 0;

for (int i = 0; i <= n; i++)

{

float x = Mathf.Sin(ang * i) * r;

float y = Mathf.Cos(ang * i) * r;

float uvx = 0;

//计算UV的X值比例

if (i < nn)

{

//面3.1

uvx = (float) num / nn;

num++;

}

else if (i >= nn)

{

//面3.2

uvx = (float) num / nn;

num--;

}

if (i == n)

{

x = Mathf.Sin(ang * 0) * r;

y = Mathf.Cos(ang * 0) * r;

}

vh.AddVert(new Vector3(x, -1, y), Color.white, new Vector2(uvx, 0));

vh.AddVert(new Vector3(x, 1, y), Color.white, new Vector2(uvx, 1));

}

for (int i = 0; i < n; i++)

{

vh.AddTriangle(i * 2 + next, (i + 1) * 2 + 1 + next, i * 2 + 1 + next);

vh.AddTriangle(i * 2 + next, (i + 1) * 2 + next, (i + 1) * 2 + 1 + next);

}

vh.FillMesh(mesh);

mesh.RecalculateNormals();

GetComponent<MeshFilter>().mesh = mesh;

}

圆柱可以使用 OpenMesh 库中的 `PolyMesh` 数据结构和 `OMWriter`,具体步骤如下: 1. 创建 `PolyMesh` 对象。 2. 分别添加圆柱的顶点、边和到 `PolyMesh` 对象中。 3. 使用 `OMWriter` 将 `PolyMesh` 对象写入到文件中。 以下是具体的代码实现: ```c++ #include <iostream> #include <fstream> #include <cmath> #include <OpenMesh/Core/IO/OMWriter.hh> #include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh> using namespace std; struct MyTraits : public OpenMesh::DefaultTraits { VertexAttributes(OpenMesh::Attributes::Normal); }; typedef OpenMesh::PolyMesh_ArrayKernelT<MyTraits> MyMesh; int main() { MyMesh mesh; // 添加圆柱的顶点 const int n = 20; // 圆柱的边数 const double r = 1.0; // 圆柱的半径 const double h = 2.0; // 圆柱的高度 MyMesh::VertexHandle v[n + 2]; for (int i = 0; i < n + 2; ++i) { double x = r * cos(2 * M_PI * i / n); double y = r * sin(2 * M_PI * i / n); double z = (i == 0 || i == n + 1) ? 0 : h; v[i] = mesh.add_vertex(MyMesh::Point(x, y, z)); } // 添加圆柱 MyMesh::FaceHandle f[2 * n]; for (int i = 0; i < n; ++i) { f[2 * i] = mesh.add_face(v[i], v[i + 1], v[i + n + 1]); f[2 * i + 1] = mesh.add_face(v[i], v[i + n + 1], v[i + n]); } // 计算圆柱的法向量 for (MyMesh::FaceIter f_it = mesh.faces_begin(); f_it != mesh.faces_end(); ++f_it) { MyMesh::Normal normal = mesh.calc_face_normal(*f_it); for (MyMesh::FaceVertexIter fv_it = mesh.fv_iter(*f_it); fv_it.is_valid(); ++fv_it) { mesh.set_normal(*fv_it, normal); } } // 将圆柱写入文件 ofstream ofs("cylinder.obj"); OpenMesh::IO::write_mesh(mesh, ofs, OpenMesh::IO::Options::VertexNormal); ofs.close(); return 0; } ``` 以上代码中,我们定义了一个 `MyMesh` 类型的对象 `mesh`,使用 `add_vertex` 和 `add_face` 分别添加圆柱的顶点和。在添加的时候,我们按照顺序连接相邻的顶点,形成三角形。最后,我们计算每个的法向量,并将法向量赋值给顶点的法向量属性。最后,使用 `OMWriter` 将 `mesh` 对象写入到 `cylinder.obj` 文件中。其中,写入文件的时候,我们使用了 `VertexNormal` 选项,表示将顶点的法向量也写入到文件中。这个选项可以让我们在渲染圆柱的时候更加真实地模拟光照效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值