zoukankan      html  css  js  c++  java
  • 自动减面

    在做游戏时,通常会有高模转低模的需求,比如生成不同层级的lod模型。但是这种操作一般会由美术人员手工完成,比较费时,且每个层级的模型都需要打包,造成包体过大。


    这里,我提供了一种运行时根据算法将高模转为指定顶点数低模的方式,不需要人工干预,且可在运行时才生成低模,打包时只要打包高模即可。


    下面是我的实现,这里我假设顶点在顶点数组里是唯一的,并未考虑各种情况,所以出现了缺面的情况。




    下面是论文作者的实现。



    下面简单介绍一下算法

    对顶点和面进行预处理,生成如下结构。







    生成之后,根据这些信息计算每个顶点向他的每个邻居顶点坍缩的代价,a向b坍缩即消去a,将a的每个邻居边里的a替换为b。


    下式为u向v坍缩的cost。



    Tu是包含顶点u的三角形的集合,Tuv是同时包含顶点u和顶点v的三角形的集合。


    两个面的法线相乘越接近1,则说明两个面是接近平行的,消去影响不大,这里用1-x/2将范围从 -1,1映射到0,1,值越小消去的影响越小。


    在最里层,找到影响的最小值,对于包含顶点u和顶点v的三角形,消去意味着这些面消失了,影响值为。


    在外层,找到影响的最大值,即找到包含u但不会消失的面对视觉的最大影响。


    最后乘以距离,距离越大,越不易消去。


    消去代价最小的节点,此时注意要即时更新第一步生成的结构

    不断消去,直到顶点数小于某值。


    工程源码:https://github.com/Ymiku/Automic-LOD


    现在的工程只提供了核心代码,虽然可以用,但是效果不好,因为一般模型会出现一个顶点在数组里出现多次的情况,不过也好解决,只要预处理一下,保证顶点唯一性就行了。


    参考:http://dev.gameres.com/Program/Visual/3D/PolygonReduction.htm

  • 相关阅读:
    图书管理系统---基于form组件和modelform改造添加和编辑
    Keepalived和Heartbeat
    SCAN IP 解释
    Configure Active DataGuard and DG BROKER
    Oracle 11gR2
    我在管理工作中積累的九種最重要的領導力 (李開復)
    公募基金公司超融合基础架构与同城灾备建设实践
    Oracle 11g RAC for LINUX rhel 6.X silent install(静默安装)
    11gR2 静默安装RAC 集群和数据库软件
    Setting Up Oracle GoldenGate 12
  • 原文地址:https://www.cnblogs.com/nafio/p/9137103.html
Copyright © 2011-2022 走看看