前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >fbx模型实现顶点偏移

fbx模型实现顶点偏移

作者头像
Jean
发布于 2022-11-25 11:31:01
发布于 2022-11-25 11:31:01
93300
代码可运行
举报
文章被收录于专栏:Web行业观察Web行业观察
运行总次数:0
代码可运行

Part1前言

有些建筑模型,建模的时候坐标采用高斯投影的方式来设置,这样会导致模型的顶点非常之大。导入到3dmax软件之后,由于其按照float精度进行渲染,从而造成渲染的模型抖动等问题。这里提出一种思路,通过将模型顶点统一进行偏移,从而解决在3dmax中渲染精度问题。

Part2fbx精度

通过如下定义可以看出fbx其实是双精度的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FBXSDK_DLL FbxVector4 : public FbxDouble4

具体fbx格式相关,可以参考之前的文章。看我七十二变:fbx格式

Part3建模测试

新建一个长宽高为1米的模型,然后将其放在x为2米 y为2米的位置,最后将原点移到原点。这种方法做出来的模型,居然顶点不会变化,保存之后如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vertices: *24 {
a: -0.5,-0.5,0,0.5,-0.5,0,-0.5,0.5,0,0.5,0.5,0,-0.5,-0.5,1,0.5,-0.5,1,-0.5,0.5,1,0.5,0.5,1
} 

通过重置变换之后,顶点就符合我们预期,发生了偏移。

顶点变换如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vertices: *24 {
a: 1.5,1.5,0,2.5,1.5,0,1.5,2.5,0,2.5,2.5,0,1.5,1.5,1,2.5,1.5,1,1.5,2.5,1,2.5,2.5,1
} 

之后我们通过fbx的sdk将顶点的x和y统一减去偏移的2米。

Part4fbxsdk代码实现

整个代码的逻辑参考fbx的sdk的demo的DisplayMesh.cxx这个文件,位置如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
D:\Program Files\Autodesk\FBX\FBX SDK\2020.3.1\samples\ImportScene

调用逻辑 1 初始化fbx的sdk

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  FbxManager *lSdkManager = NULL;
  FbxScene *lScene = NULL;
  // Prepare the FBX SDK.
  InitializeSdkObjects(lSdkManager, lScene);

2 加载fbx模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string lFilePath = R"(D:\work\code\study\github\other\fbxsdk\cplus\tt.fbx)";
auto lResult = LoadScene(lSdkManager, lScene, lFilePath.c_str());

3 遍历模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  FbxNode *rootNode = lScene->GetRootNode();
  if (rootNode)
  {
    for (auto i = 0; i < rootNode->GetChildCount(); i++)
    {
      DisplayContent(rootNode->GetChild(i));
    }
  }

DisplayContent函数中,这里只处理FbxNodeAttribute::eMesh格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  for (auto i = 0; i < pNode->GetChildCount(); i++)
  {
    DisplayContent(pNode->GetChild(i));
  }

  FbxNodeAttribute::EType lAttributeType;
  if (pNode->GetNodeAttribute() == NULL)
  {
    std::cout << "NULL Node Attribute" << std::endl;
    return;
  }
  lAttributeType = (pNode->GetNodeAttribute()->GetAttributeType());
  if (FbxNodeAttribute::eMesh == lAttributeType)
  {
    DisplayMesh(pNode);
  }

DisplayMesh处理中,我们只处理顶点信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  FbxMesh *lMesh = (FbxMesh *)pNode->GetNodeAttribute();
  DisplayControlsPoints(lMesh);

DisplayControlsPoints中对顶点信息进行统一偏移,这里减去了x和y的2米

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  int i, lControlPointsCount = pMesh->GetControlPointsCount();
  FbxVector4 *lControlPoints = pMesh->GetControlPoints();
  for (i = 0; i < lControlPointsCount; i++)
  {
    lControlPoints[i][0] = lControlPoints[i][0] - 2;
    lControlPoints[i][1] = lControlPoints[i][1] - 2;
  }

4 保存场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SaveScene(lSdkManager, lScene, "tt2.fbx");

Part5总结

本文主要实现了通过fbx的sdk来实现模型顶点的统一偏移。代码在github仓库地址如下:https://github.com/inveta/ModelProcess/tree/main/VertexOffset

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebHub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CG-Assignment2
本次作业在第一次作业的基础上,增加一个bezier曲面,并对场景添加光照和纹理效果。具体要求如下:
alanzeng
2025/01/14
540
CG-Assignment2
基于UE4/Unity绘制地图基础元素-线(下篇)
上篇中记录了绘制线的基本流程,而下篇主要是对绘制线中遇到的性能和效果问题进行阐述。在绘制完一条线并且希望给其加上描边样式时,会遇到不可避免的闪烁问题。而在绘制大量的交错道路时,需要同时考虑绘制性能和闪烁问题如何解决。本文总结了高效绘制描边线的方法,并对调研过的解决Z-Fighting闪烁的方案进行阐述。
腾讯位置服务
2020/10/30
1.1K0
开源篇--精准定位 模型重心坐标
模型重心坐标就是在模型正中心那个点的坐标。本文介绍一种方法,可以通过代码的方式自动获取模型重心坐标。本方式适用于常用的所有模型。
Jean
2022/11/25
1.6K0
开源篇--精准定位 模型重心坐标
基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型
随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用。
HT_hightopo
2019/03/12
1.4K0
基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型
这样搭建 3D 电子围栏,安防运维效率提高90%!
现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 HT for Web 产品来构造轻量化的 3D 可视化场景,该 3D 场景从正面展示了一个现代化工厂的现实场景,包括工厂工人的实时位置、电子围栏的范围、现场的安全情况等等,帮助我们直观的了解当前工厂人员的安全状况。
用户7703111
2020/12/08
9040
这样搭建 3D 电子围栏,安防运维效率提高90%!
NDK OpenGL ES 3.0 开发(二十一):3D 模型加载和渲染
上一节简单介绍了常用的 3D 模型文件 Obj 的数据结构和模型加载库 Assimp 的编译,本节主要介绍如何使用 Assimp 加载 3D 模型文件和渲染 3D 模型。
字节流动
2020/06/02
9290
Unity3d场景快速烘焙【2020】
很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不到结果,好不容易烘焙完了,黑斑、撕裂、硬边、漏光或漏阴影等缺陷遍布,惨不忍睹,整体效果暗无层次,或者苍白无力,灯光该亮的亮不起来,该暗的暗不下去,更谈不上有什么意境,痛苦的折磨,近乎失去了信心,一个团队从建模到程序,都没什么问题,可一到烘焙这一关,就堵得心塞,怎么也搞不出好的视觉效果,作品没法及时向用户交付,小姐姐在这里分享一些自己的经验,希望能帮到受此痛苦折磨的朋友,话不多说,开工!
全栈程序员站长
2022/07/01
4.3K0
Unity3d场景快速烘焙【2020】
Unity3D开发资料
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
全栈程序员站长
2022/09/13
2K0
基于HTML5 WebGL的工业化3D电子围栏
现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 HT for Web 产品来构造轻量化的 3D 可视化场景,该 3D 场景从正面展示了一个现代化工厂的现实场景,包括工厂工人的实时位置、电子围栏的范围、现场的安全情况等等,帮助我们直观的了解当前工厂人员的安全状况。
HT for Web
2019/10/09
6110
基于HTML5 WebGL的工业化3D电子围栏
OBJ 3D模型格式介绍
OBJ 是一种几何定义文件格式,Wavefront Technologies 公司在可视化加强动画包中第一次使用了这个格式,文件格式是公开的,并具有及其优质的兼容性和跨平台、跨行业的通用性,在所有 3D 应用软件中被支持。
为为为什么
2024/07/13
2810
WebGPU 入门:绘制一个三角形
今天我们来入门 WebGPU,来写一个图形版本的 Hello World,即绘制一个三角形。
前端西瓜哥
2023/09/24
4650
WebGPU 入门:绘制一个三角形
Android多媒体之GLES2战记第五集--宇宙之光
你以为我的封面图只是吸引眼球? 上集说到:用矩阵的变换来操作顶点,使图形产生相应的变化(移动,选择,缩放) 这一集将点亮世界之光,让你对OpenGL的世界有更深的了解 普通副本五:黑龙之珠
张风捷特烈
2019/03/05
7770
Android多媒体之GLES2战记第四集--移形换影
这也就是m12,m13,m14,m15为什么特别,m0,m1,m2,m3为什么和x息息相关
张风捷特烈
2019/01/28
5860
Android多媒体之GLES2战记第四集--移形换影
开发成长之路(5)-- C语言从入门到开发(仿ATM机项目,我写的第一个项目)
文章目录 项目需求分析 放码过来 ---- 项目需求分析 时间过得是真的快啊,这么快C语言的基础语法就讲过去了,是时候开始讲项目了。 那就进项目吧,需求分析。 1、需要有操作界面。最好能有光标定位的。 2、实现登录注册功能,其中账号限制六位数字,密码限制八位数字与英文结合。 3、实现存取款功能 4、实现转账功能,双方的数据都需要有改变 5、实现账户信息搜索功能,分精确搜索和模糊搜索。搜索账户、搜索存取款、搜索转账。时间搜索、账号搜索等。 6、以上这些功能都需要持久化,即程序重启之后之前的操作都还在。
看、未来
2021/09/18
9140
基于 FFmpeg 的 Cocos Creator 视频播放器
腾讯开心鼠项目使用的游戏引擎是 Cocos Creator,由于引擎提供的视频组件实现方式问题导致视频组件和游戏界面分了层,从而导致了以下若干问题:
陈皮皮
2021/01/04
6.4K2
基于 FFmpeg 的 Cocos Creator 视频播放器
PhysX SDK物理引擎开发包使用及获取c++源码教程
PS: 社区目前正在预演MMO类型的大型3D 服务器架构(Go实现),PX首选作为物理引擎使用。
李海彬
2018/07/26
2.7K0
PhysX SDK物理引擎开发包使用及获取c++源码教程
SceneKit绘制模型与骨骼动画的实现
#####研究目的 sceneKit里可以绘制几种几何模型,但那些不规律的形状如果不想使用模型,那么就要自己绘制了 #####demo效果 [1.gif] [Untitled.gif] #####原理和步骤 1.定义 模型的 顶点坐标 纹理坐标 法线 骨骼顶点 骨骼动画 等数据 2.调用以下方法画出模型 根据顶点坐标和模型类型画出模型,模型类型可以是点、线、三角形 为什么是三角形呢?因为三角形是最小边几何图形 + (instancetype)geometrySourceWi
2018/05/07
2.9K2
SceneKit绘制模型与骨骼动画的实现
OpenGLES-07 纹理
前面的文章都是绘制实实在在的图形的,在OpenGL中,我们还可以使用纹理图片来渲染图形,使用图片可以让描绘出来的物体更加真实也可以让我们的开发更加简单。 资料:http://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/06%20Textures/ 。 接下来我们直接开始代码书写: 1.开始之前,我们把工具类GLESUtils优化一下,使之能直接返回我们需要的program。用了这么久,希望你自己也能封装。 修改.h #impo
清墨
2018/05/07
1.4K0
OpenGLES-07 纹理
顶点属性、顶点数组和缓冲区对象
所有OpenGL ES 3.0实现必须支持最少16个顶点属性。 以下代码实现了如何查询OpenGL ES 3.0实现真正支持的顶点属性数量。
103style
2022/12/19
8490
顶点属性、顶点数组和缓冲区对象
图元装配和光栅化
图元可以用 glDrawArrays、glDrawElements、glDrawRangeElements、glDrawArraysInstanced、glDrawElementsInstanced 命令绘制的几何形状对象。
103style
2022/12/19
3.1K0
图元装配和光栅化
相关推荐
CG-Assignment2
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文