Mesh 顶点的Normal

美术经常找程序撕逼,我做的顶点在max里面只有xxx那么少,但是程序说我再unity看到的就是有XXX那么多。为什么?


因为有些公共顶点直观感受是一个,实际上是应该按照三角面的个数来计数的。


同样。公共顶点的法线也不止一个。


不过,因为normal是影响光照效果,即在光照下的凹凸平滑程度,所以用插值平均后的Normal代替所有的顶点的各自的normal可使低精度模型看起来平滑




显示编辑器下显示 normal 的脚本,参考

using UnityEngine;

[ExecuteInEditMode]
public class ShowNormals : MonoBehaviour {

    public float length = 1;

    public Vector3 bias;

    // Update is called once per frame
    void Update() {
        // 获取网格法线
        Mesh mesh = GetComponent<MeshFilter>().sharedMesh;

        Vector3[] vertices = mesh.vertices
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
绘圆柱可以使用 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、付费专栏及课程。

余额充值