【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 11553|回复: 0

FBX(1) 初步尝试 获取顶点坐标

[复制链接]
发表于 2012-9-6 17:12:24 | 显示全部楼层 |阅读模式
本帖最后由 夜行的猫仔 于 2012-9-16 13:00 编辑

FBX环境配置请点击这里
DirectX SDK的安装与开发环境的配置
http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=22539&fromuid=14479


同过一天对FBX SDK的了解,基本上了解了FBX的大致调用过程,并通过微软的D3D将FBX数据绘制出来。

1

1


在3DsMax中创建一个单位1的红色Box:

通过FBX_Samples01程序读入FBX到内存,获取FBX模型坐标,填充到D3DXMESH中并画出来~~~
目前没有实现读取模型颜色,d3d里面的模型颜色是我手动指定的。
也没有找到Fbx的顶点索引数据,因此我手动指定了索引缓冲取的排列。

以上例题源码下载地址:
http://kuai.xunlei.com/d/SAIKKXEKUEVO

以下讲解完成fbx文件读写需要的一些步骤。在这里主要讲解读取fbx文件,关于显示使用到的到d3d部分请同学们到论坛的d3d区补充学习。


初始化FbxManager和FbxScene:
在进行使用SDK进行FBX的处理操作之前需要先初始化两个必须的FBX对象:FbxManager和FbxScene
  1. bool CFBXLoader::Initialize()
  2. {
  3.         // Create the FBX SDK Manager, destroy the old manager at first
  4.         if(m_pFBXSDKManager)  
  5.         {  
  6.                 m_pFBXSDKManager->Destroy();
  7.         }

  8.         m_pFBXSDKManager = KFbxSdkManager::Create();
  9.         if(m_pFBXSDKManager == NULL)  
  10.         {
  11.                 return false;
  12.         }

  13.         // Create an IOSettings object  
  14.         KFbxIOSettings* ios = KFbxIOSettings::Create(m_pFBXSDKManager , IOSROOT);  
  15.         m_pFBXSDKManager->SetIOSettings(ios);  

  16.         //Load plugins from the executable directory (optional)
  17.         FbxString lPath = FbxGetApplicationDirectory();
  18.         m_pFBXSDKManager->LoadPluginsDirectory(lPath.Buffer());

  19.         // Create the entity that hold the whole Scene  
  20.         m_pFBXSDKScene = KFbxScene::Create(m_pFBXSDKManager , "");  
  21.         if(m_pFBXSDKScene == NULL)  
  22.         {
  23.                 return false;
  24.         }
  25.         return true;  

  26. }
复制代码
这里面关键性的变量有两个:m_pFBXSDKManager 和 m_pFBXSDKScene。

fbx文件数据的加载:
  1. bool CFBXLoader::LoadFile(const char* pSeneName)
  2. {
  3.         if(m_pFBXSDKManager == NULL)  
  4.         {  
  5.                 return false;  
  6.         }  

  7.         int lFileMajor, lFileMinor, lFileRevision;
  8.         int lSDKMajor,  lSDKMinor,  lSDKRevision;
  9.         int lAnimStackCount;
  10.         //char lPassword[1024];

  11.         // Get the file version number generate by the FBX SDK.  
  12.         KFbxSdkManager::GetFileFormatVersion(lSDKMajor , lSDKMinor , lSDKRevision);  

  13.         // Create an importer.
  14.         int lFileFormat = -1;
  15.         KFbxImporter* pKFBXImporter = KFbxImporter::Create(m_pFBXSDKManager , "");  

  16.         if (!m_pFBXSDKManager->GetIOPluginRegistry()->DetectReaderFileFormat(pSeneName, lFileFormat) )
  17.         {
  18.                 // Unrecognizable file format. Try to fall back to FbxImporter::eFBX_BINARY
  19.                 lFileFormat = m_pFBXSDKManager->GetIOPluginRegistry()->FindReaderIDByDescription( "FBX binary (*.fbx)" );;
  20.         }

  21.         // Initialize the importer by providing a filename  
  22.         bool importStatus = pKFBXImporter->Initialize(pSeneName , -1 , m_pFBXSDKManager->GetIOSettings());  
  23.         pKFBXImporter->GetFileVersion(lFileMajor , lFileMinor , lFileRevision);  

  24.         if(!importStatus)  
  25.         {  
  26.                 return false;  
  27.         }  

  28.         FbxTakeInfo* lTakeInfo;
  29.         if (pKFBXImporter->IsFBX())
  30.         {
  31.                  lAnimStackCount = pKFBXImporter->GetAnimStackCount();
  32.                  for(int i = 0; i < lAnimStackCount; i++)
  33.                  {
  34.                          lTakeInfo = pKFBXImporter->GetTakeInfo(i);
  35.                  }

  36.                  //IOS_REF.SetBoolProp(IMP_FBX_MATERIAL,        true);
  37.                  //IOS_REF.SetBoolProp(IMP_FBX_TEXTURE,         true);
  38.                  //IOS_REF.SetBoolProp(IMP_FBX_LINK,            true);
  39.                  //IOS_REF.SetBoolProp(IMP_FBX_SHAPE,           true);
  40.                  //IOS_REF.SetBoolProp(IMP_FBX_GOBO,            true);
  41.                  //IOS_REF.SetBoolProp(IMP_FBX_ANIMATION,       true);
  42.                  //IOS_REF.SetBoolProp(IMP_FBX_GLOBAL_SETTINGS, true);
  43.         }
  44.         // Import the scene  
  45.         importStatus = pKFBXImporter->Import(m_pFBXSDKScene);  

  46.         // Destroy the importer.  
  47.         pKFBXImporter->Destroy();  

  48.         return importStatus;  

  49. }
复制代码
FBX资源的释放只需要释放FbxManager即可。
  1. CFBXLoader::~CFBXLoader(void)
  2. {
  3.         //Delete the FBX Manager. All the objects that have been allocated using the FBX Manager and that haven't been explicitly destroyed are also automatically destroyed.
  4.         m_pFBXSDKManager->Destroy();
  5. }
复制代码
获取Box的顶点数据

  1. void CFBXLoader::GetMeshInfo(FbxNode* pNode)
  2. {
  3.          FbxMesh* lMesh = (FbxMesh*) pNode->GetNodeAttribute ();

  4.          GetControlsPoints(lMesh);

  5. }

  6. void CFBXLoader::GetControlsPoints(FbxMesh* pMesh)
  7. {
  8.         int i, lControlPointsCount = pMesh->GetControlPointsCount();
  9.         FbxVector4* lControlPoints = pMesh->GetControlPoints();        

  10.         FbxVector4  temp;

  11.         for (i = 0; i < lControlPointsCount; i++)
  12.         {
  13.                 temp = lControlPoints[i];
  14.                 vBuffer[i].x = temp.mData[0];
  15.                 vBuffer[i].y = temp.mData[1];
  16.                 vBuffer[i].z = temp.mData[2];
  17.                 vBuffer[i].color = 0xffFF0000;
  18.         }
  19. }
复制代码
GetMeshInfo函数通过pNode->GetNodeAttribute ()方法获取到当前指向的mesh数据地址。
然后通过pMesh->GetControlPointsCount();获取模型定点个数, 通过pMesh->GetControlPoints();函数获取顶点数据首地址。
指针lControlPoints 内保存的就是顶点数据,数量个数为lControlPointsCount 个。lControlPoints是一个FbxVector4四维向量,其中数据排列的顺序是x,y,z,w。不懂齐次坐标w的此处可以忽略,以为作为顶点数据这里都是0。
下面通过一个循环从内存中逐个将数据取出存放在缓存vBuffer中。
  1.         FbxVector4  temp;
  2.         for (i = 0; i < lControlPointsCount; i++)
  3.         {
  4.                 temp = lControlPoints[i];
  5.                 vBuffer[i].x = temp.mData[0];
  6.                 vBuffer[i].y = temp.mData[1];
  7.                 vBuffer[i].z = temp.mData[2];
  8.         }
复制代码
为了方便测试看到赋值情况,我中间临时增加了一个temp变量,仅作测试时使用。

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-4-29 17:20

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表