Part1前言

模型重心坐标就是在模型正中心那个点的坐标。本文介绍一种方法,可以通过代码的方式自动获取模型重心坐标。本方式适用于常用的所有模型。

Part2重心坐标

我们都学过初中几何,可以知道三角形重心是三角形三条中线的交点。当几何体为匀质物体时,重心与形心重合。下图中O为三角形的重心。

换算成笛卡尔坐标系
三角形三个顶点为(x1,y1),(x2,y2),(x3,y3)
那么重心坐标 =((X1+X2+X3)/3,(Y1+Y2+Y3)/3)
到了我们三维模型中,重心坐标依旧和这个公式类似,等于所有三角面重心点之和的平均值。
模型重心如下图所示:

Part3代码获取模型重心

这里我们通过assimp库来获取模型的重心。关于assimp,参考我们上一篇文章。三维模型格式转换神器-assimp

这里我们以fbx模型为例,来说明获取重心的步骤。分为以下几个步骤:
1、加载模型获取aiScene
2、遍历aiScene下RootNode下的所有节点
3、获取aiMesh来计算模型的重心

1加载模型

加载模型示例代码如下:

auto inFile = R"(tt2.fbx)";Assimp::Importer mImporter;const aiScene *mScenePtr = mImporter.ReadFile(inFile, aiProcess_MakeLeftHanded);if (nullptr == mScenePtr){std::cout << "nullptr == mScenePtr" << std::endl;return -1;}

2遍历node

整个assimp的场景是一个树状结构,从root节点开始,如下图

我们通过递归进行遍历

void FindMesh(const aiScene *scene, aiNode *node)
{FindMeshInfo(scene, node);for (unsigned int m = 0; m < node->mNumChildren; ++m){FindMesh(scene, node->mChildren[m]);}
}

调用递归遍历函数如下:

auto rootNode = mScenePtr->mRootNode;FindMesh(mScenePtr, rootNode);

3计算重心

重心的计算是最复杂的部分,分为两个步骤。
第一步:计算网格体的重心
第二步:加上变换矩阵
变换矩阵是指增加在模型上面的平移旋转缩放的变换矩阵,从而导致模型的重心位置发生变化。

计算网格体的重心又细分为一下两步:
1、计算每个三角面的重心点
2、计算所有三角面重心之和的平均值

代码示例

aiVector3D nodeCenter(0, 0, 0);for (unsigned int meshi = 0; meshi < node->mNumMeshes; meshi++){auto meshIndex = node->mMeshes[meshi];auto mesh = scene->mMeshes[meshIndex];aiVector3D meshCenter(0, 0, 0);for (unsigned int facei = 0; facei < mesh->mNumFaces; facei++){aiVector3D faceCenter(0, 0, 0);auto face = mesh->mFaces[facei];for (unsigned int indicei = 0; indicei < face.mNumIndices; indicei++){auto indice = face.mIndices[indicei];faceCenter = faceCenter + mesh->mVertices[indice];}faceCenter = faceCenter /= (ai_real)face.mNumIndices;meshCenter = meshCenter + faceCenter;}meshCenter = meshCenter /= (ai_real)mesh->mNumFaces;nodeCenter = nodeCenter + meshCenter;}nodeCenter = nodeCenter /= (ai_real)node->mNumMeshes;

加上旋转变换矩阵示例如下:

nodeCenter = nodeCenter /= (ai_real)node->mNumMeshes;nodeCenter = nodeCenter *= node->mTransformation;auto parent = node->mParent;while (true){if (nullptr == parent){break;}std::string name = parent->mName.C_Str();nodeCenter = nodeCenter *= parent->mTransformation;parent = parent->mParent;}std::cout << node->mName.C_Str() << std::endl;std::cout << "x:" << nodeCenter.x << " y:" << nodeCenter.y << " z:" << nodeCenter.z << std::endl;

4与3dmax重心坐标比较

由于模型存在右手坐标系以及Y轴向上和Z轴向上,所以求出的模型重心坐标在各自坐标系下都有稍许区别。这里与3dmax进行比较结论如下:

1、当3dmax导出的fbx为Z轴向上时
3dmax坐标如下:
box01:中心点坐标(0,-0.5,1)
box02:中心点坐标(0,1.5,1)
box03:中心点坐标(2,-0.5,0)

assimp计算结果,采用左手坐标系
box01:中心点坐标 (0,-0.5,-1)
box02:中心点坐标(0,1.5,-1)
box03:中心点坐标(2,-0.5,0)

结论:整个重心点坐标,只需要Z轴取反,即可和3dmax一致

1、当3dmax导出的fbx为Y轴向上时
3dmax坐标如下:
box01:中心点坐标(0,-0.5,1)
box02:中心点坐标(0,1.5,1)
box03:中心点坐标(2,-0.5,0)

assimp计算结果,依旧采用左手坐标系
box01:中心点坐标 (0,1,-0.5)
box02:中心点坐标(0,1,1.5)
box03:中心点坐标(2,0,-0.5)

结论:整个重心点坐标,只需要交换Y轴和Z轴,即可和3dmax一致

Part4总结

本文主要介绍了如何通过assimp获取模型的重心坐标。项目开源地址:
https://github.com/inveta/ModelProcess

Part5关于IN VETA

IN VETA是一支由建模、美术、UE5组成的年轻团队。

我们的开源项目:
https://github.com/inveta

我们致力于三维数字孪生技术分享与研发。
欢迎与各界朋友一起探讨技术与商务合作,一起推动数字孪生的发展。

开源篇--精准定位 模型重心坐标相关推荐

  1. 北大95后「AI萝莉」回来了,一次中8篇顶会论文的她,现在达摩院开源7大NLP模型...

    梦晨 博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 曾有一位北大硕士生,在校期间一次性在国际顶会ACL中标8篇论文,其中2篇一作,还登上了知乎热搜. 在那次热搜之后,这位"论文 ...

  2. 北大95后「AI萝莉」回来了,一次中8篇顶会论文的她,现在达摩院开源7大NLP模型

    曾有一位北大硕士生,在校期间一次性在国际顶会ACL中标8篇论文,其中2篇一作,还登上了知乎热搜. 在那次热搜之后,这位"论文大户"似乎逐渐销声匿迹. 今天,她带着阿里达摩院深度语言 ...

  3. 谷歌跨界医学新动作:基因突变定位模型又更!新!了!

    Root 编译自 Google Research Blog 量子位 出品 | 公众号 QbitAI 去年12月,谷歌大脑发布了快速找出基因突变位点的深度学习模型DeepVariant,用图像识别的思路 ...

  4. OPENMV上的目标检测,目标定位模型

    目标板定位模型 代码地址 前言 在17届省赛结束后,因为担心国赛场地光照影响较大,写了这个目标检测算法.但因为时间以及实力不足,算法仅有了个雏形,没能成功部署,非常遗憾. 今年寒假终于有时间将其完善, ...

  5. 开源社区的治理模型应当因地制宜

    比起开发功能或重构代码,社区治理听起来既不酷也不有趣. 然而,随着社区规模的不断扩大,社区事务日渐增长和复杂,社区成员也期待有专职人员按照明确的规则来协调社区事务的开展,这其实就是治理模型的一部分. ...

  6. 酒店同质化时代,荟语酒店如何通过精准定位突围出圈

    锦绣金秋,共赢未来.9月22日,锦江酒店(中国区)酒店投资人沙龙活动圆满落幕,众多业内大咖.资深投资人齐聚深圳,多维探讨市场趋势和机遇.活动现场高含金量投资干货.多个品牌新动向接连输出,持续为投资人赋 ...

  7. 阿里开源新一代 AI 算法模型,由达摩院90后科学家研发

    最炫的技术新知.最热门的大咖公开课.最有趣的开发者活动.最实用的工具干货,就在<开发者必读>! 每日集成开发者社区精品内容,你身边的技术资讯管家. 每日头条 阿里开源新一代 AI 算法模型 ...

  8. osg 三维gis开发_GIS+BIM跨界融合应用:智能管理道路“健康”,精准定位路桥病害...

    点击上方蓝字  关注路桥BIM知识二环路高架桥是成都市中心城区最重要的快速通道,全程无红绿灯,2013年5月建成通车后,每天运送20多万人次.为及时发现和消除道路病害,保障道路畅通,二环路管养单位(成 ...

  9. 如何实现室内Wi-Fi无线终端的精准定位

    如何实现室内Wi-Fi无线终端的精准定位 如何实现室内Wi-Fi无线终端的精准定位 随着商圈020的兴起,室内定位技术的也如百花争艳般不断涌现.但随着室内Wi-Fi网的架设普及,基于Wi-Fi定位技术 ...

最新文章

  1. JMH和Arthas定位问题的案例分享
  2. PHP运算符种类很多 主要有,PHP运算符的类别概览
  3. 数据结构 - 反转单链表(C++)
  4. 折纸机器人的步骤图解_折纸图解老虎
  5. 第十章 优先级队列 (b1)完全二叉堆:结构
  6. Qt--qss(暗橙色)
  7. Web前端开发笔记——第二章 HTML语言 第十节 画布标签、音视频标签
  8. RROR in main Module not found: Error: Can‘t resolve ‘index.js‘
  9. 通俗易懂设计模式解析——代理模式
  10. R7-3 福到了 (10 分)
  11. 使用账户和密码在FTP客户端连接FTP服务器,出现vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot
  12. jQuery实用小技巧--输入框文字获取和失去焦点
  13. 2020华为软挑热身赛 个人总结
  14. Java之父评价C语言之父,Java之父评价C语言之父:C语言撑起了一切
  15. 甘肃自考计算机技术,甘肃自考计算机与网络技术基础课程考试说明
  16. 哈尔滨啤酒集团有限公司盈利能力分析毕业设计
  17. MongoDB和MySQL常用增删改查语句
  18. [译]eBay Elasticsearch性能调优实践
  19. 专注要事、把手弄脏、高效优雅是对抗规模化焦虑的好办法--读Getting Real(达成现实)和 Rework(重塑工作)
  20. “开源是一个自我实现的预言”,Shifu创始人陈永立说道

热门文章

  1. cors 后端解决跨域问题
  2. 電腦教室的管理與規劃
  3. 以发票为切口有效规避企业税务风险
  4. 流媒体服务器搭建亲测有效(srs)
  5. r9 5900hx和i9 12900h哪个好
  6. iOS NSURLSession的简单使用
  7. python中pop 0_python中pop()与pop(0)的时间复杂度区别
  8. 修改pipenv虚拟环境安装位置
  9. Unreal 入门-Unreal 基础知识。
  10. 【数据结构】图—迪杰斯特拉(Dijkstra)算法