开源篇--精准定位 模型重心坐标
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
我们致力于三维数字孪生技术分享与研发。
欢迎与各界朋友一起探讨技术与商务合作,一起推动数字孪生的发展。
开源篇--精准定位 模型重心坐标相关推荐
- 北大95后「AI萝莉」回来了,一次中8篇顶会论文的她,现在达摩院开源7大NLP模型...
梦晨 博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 曾有一位北大硕士生,在校期间一次性在国际顶会ACL中标8篇论文,其中2篇一作,还登上了知乎热搜. 在那次热搜之后,这位"论文 ...
- 北大95后「AI萝莉」回来了,一次中8篇顶会论文的她,现在达摩院开源7大NLP模型
曾有一位北大硕士生,在校期间一次性在国际顶会ACL中标8篇论文,其中2篇一作,还登上了知乎热搜. 在那次热搜之后,这位"论文大户"似乎逐渐销声匿迹. 今天,她带着阿里达摩院深度语言 ...
- 谷歌跨界医学新动作:基因突变定位模型又更!新!了!
Root 编译自 Google Research Blog 量子位 出品 | 公众号 QbitAI 去年12月,谷歌大脑发布了快速找出基因突变位点的深度学习模型DeepVariant,用图像识别的思路 ...
- OPENMV上的目标检测,目标定位模型
目标板定位模型 代码地址 前言 在17届省赛结束后,因为担心国赛场地光照影响较大,写了这个目标检测算法.但因为时间以及实力不足,算法仅有了个雏形,没能成功部署,非常遗憾. 今年寒假终于有时间将其完善, ...
- 开源社区的治理模型应当因地制宜
比起开发功能或重构代码,社区治理听起来既不酷也不有趣. 然而,随着社区规模的不断扩大,社区事务日渐增长和复杂,社区成员也期待有专职人员按照明确的规则来协调社区事务的开展,这其实就是治理模型的一部分. ...
- 酒店同质化时代,荟语酒店如何通过精准定位突围出圈
锦绣金秋,共赢未来.9月22日,锦江酒店(中国区)酒店投资人沙龙活动圆满落幕,众多业内大咖.资深投资人齐聚深圳,多维探讨市场趋势和机遇.活动现场高含金量投资干货.多个品牌新动向接连输出,持续为投资人赋 ...
- 阿里开源新一代 AI 算法模型,由达摩院90后科学家研发
最炫的技术新知.最热门的大咖公开课.最有趣的开发者活动.最实用的工具干货,就在<开发者必读>! 每日集成开发者社区精品内容,你身边的技术资讯管家. 每日头条 阿里开源新一代 AI 算法模型 ...
- osg 三维gis开发_GIS+BIM跨界融合应用:智能管理道路“健康”,精准定位路桥病害...
点击上方蓝字 关注路桥BIM知识二环路高架桥是成都市中心城区最重要的快速通道,全程无红绿灯,2013年5月建成通车后,每天运送20多万人次.为及时发现和消除道路病害,保障道路畅通,二环路管养单位(成 ...
- 如何实现室内Wi-Fi无线终端的精准定位
如何实现室内Wi-Fi无线终端的精准定位 如何实现室内Wi-Fi无线终端的精准定位 随着商圈020的兴起,室内定位技术的也如百花争艳般不断涌现.但随着室内Wi-Fi网的架设普及,基于Wi-Fi定位技术 ...
最新文章
- JMH和Arthas定位问题的案例分享
- PHP运算符种类很多 主要有,PHP运算符的类别概览
- 数据结构 - 反转单链表(C++)
- 折纸机器人的步骤图解_折纸图解老虎
- 第十章 优先级队列 (b1)完全二叉堆:结构
- Qt--qss(暗橙色)
- Web前端开发笔记——第二章 HTML语言 第十节 画布标签、音视频标签
- RROR in main Module not found: Error: Can‘t resolve ‘index.js‘
- 通俗易懂设计模式解析——代理模式
- R7-3 福到了 (10 分)
- 使用账户和密码在FTP客户端连接FTP服务器,出现vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot
- jQuery实用小技巧--输入框文字获取和失去焦点
- 2020华为软挑热身赛 个人总结
- Java之父评价C语言之父,Java之父评价C语言之父:C语言撑起了一切
- 甘肃自考计算机技术,甘肃自考计算机与网络技术基础课程考试说明
- 哈尔滨啤酒集团有限公司盈利能力分析毕业设计
- MongoDB和MySQL常用增删改查语句
- [译]eBay Elasticsearch性能调优实践
- 专注要事、把手弄脏、高效优雅是对抗规模化焦虑的好办法--读Getting Real(达成现实)和 Rework(重塑工作)
- “开源是一个自我实现的预言”,Shifu创始人陈永立说道