zoukankan      html  css  js  c++  java
  • How to get current deformed vertex positions in MoBu?

    As you know, you can fetched the static geo metric data from a FBModel using the following ways:

    Get vertex:

       model.Geometry.GetPositionsArray(); 

    Get indices:

       model.Geometry.PolygonVertexArrayGet()

    But when the model is deformed(Skinning, BlendShape, PointCache), GetPositionsArray() always returns the same static coordinates, regardless of the current animation position. How can you get the deformed vertex positions?

    Actually, MotionBuilder has made many low level changes regarding the internal geometry data structure to utilize the modern and powerful GPU capability since the MotionBuilder 2011 version. These changes did improve the deformation (skinning & blendshape) and display performance of the dense geometry a lot on the CUDA enabled cards according to our internal initial benchmark. You can get the vertex/normal position before/after deformation (Skinning, BlendShape, PointCache) via the ORSDK for the internal geometry, while the deformation could still happen in GPU side

    Note that since MoBu 2011, we do convert all kinds of original geometry format (FBMesh, FBNurb, FBPatch, access via FBModel::Geometry property) into a tessellated triangle mesh. According the material/texture/UVSet/Normal and etc layer elements mapping combination, control point is split sometimes to preserve visual fidelity. In the end, this TessellatedMesh is converted to an OpenGL vertex/index buffer object friendly format (FBModelVertexData, access via FBModel::ModelVertexData).

    MoBu perform deformation (GPU or CPU) & rendering only on this final ModelVertexData.

    So back to the question itself, if you want to get the deformed vertex positions, you can use the following methods of FBModelVertexData class:

      int * GetIndexArray();

      void * GetVertexArray (FBGeometryArrayID pArrayId, bool pAfterDeform=true); 

      unsigned int GetVertexArrayVBOId (FBGeometryArrayID pArrayId, bool pAfterDeform=true);

      void * GetVertexArrayVBOOffset (FBGeometryArrayID pArrayId, bool pAfterDeform=true);

    Before using them, be sure to Use VertexArrayMappingRequest()/VertexArrayMappingRelease() to toggle CPU / GPU skinning per model when necessary.

  • 相关阅读:
    【Git】时光机命令—Git命令
    【Vue.js】vue引入组件报错:该组件未注册?
    【CSS】flex布局初认识
    【Vue.js】基于vue的实时搜索,在结果中高亮显示关键词
    MyBatis介绍并解决jdbc编程的问题
    MyBatis中 #{} 和 ${}的区别
    Mybatis执行操作时控制台日志中显示sql语句
    Mybatis中常见操作(基本操作+动态sql+sql片段+关联映射(resultMap))
    Spring配置初始化和销毁的方法
    平时工作常用linux命令总结
  • 原文地址:https://www.cnblogs.com/johnonsoftware/p/4128375.html
Copyright © 2011-2022 走看看