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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

查看: 3521|回复: 0

FBX(2) 第二步 获取顶点色

[复制链接]
发表于 2012-9-7 16:29:01 | 显示全部楼层 |阅读模式
昨天通过FBX的官方例题写了一个简单的读取顶点坐标的小程序,今天完成昨天没有完成的两件事:读取三角形索引缓冲区和顶点色。

box

box


效果如上图所示。昨天绘制的红色Box的顶点色是手动写在程序里的,无论在3DsMax 做的什么颜色的Box在程序里都是红的。今天的程序可以让Box在3DsMax存成什么颜色,就绘制什么颜色。需要强调的一下是昨天的模型无法获取顶点色问题在模型上。主要是不会用3DsMax,误以为染成红色就是顶点色是红的。其实在3DsMaX里染顶点色还颇费一番周折。02例题里加入新的模型,采用了红黄两种颜色。在这里又发现了新的问题,在3DsMax中设定的颜色和显示是来的位置不同,这样又回到了上一个例题中的一个问题,即发现绘制出来的模型位置不准确。到02例题可以肯定的是我们可以读取颜色信息和位置信息,但是会和3DsMax的位置不一样。

本例题完整代码下载:
http://kuai.xunlei.com/d/SDFEIFHOUQLO备用地址:
金山快盘附件FBX_Samples02.zip(3.16MB)

在新的例题中只增加了一个函数:void GetPolygonsInfo(FbxMesh* pMesh)解决了颜色读取,顺便解决了indexbuffer。
  1. void CFBXLoader::GetPolygonsInfo(FbxMesh* pMesh)
  2. {
  3.         //获取多边形数量
  4.         int lPolygonCount = pMesh->GetPolygonCount();
  5.         FbxVector4* lControlPoints = pMesh->GetControlPoints();        
  6.         int vertexId = 0;

  7.         //遍历每一个多边形
  8.         for (int i = 0; i < lPolygonCount; i++)
  9.         {
  10.                 //每一个多边形有几个点组成
  11.                 int lPolygonSize = pMesh->GetPolygonSize(i);
  12.                 for (int j = 0; j < lPolygonSize; j++)
  13.                 {
  14.                         int lControlPointIndex = pMesh->GetPolygonVertex(i, j);
  15.                         iBuffer[3*i+j] = lControlPointIndex;

  16.                         for (int l = 0; l < pMesh->GetElementVertexColorCount(); l++)
  17.                         {
  18.                                 FbxGeometryElementVertexColor* leVtxc = pMesh->GetElementVertexColor( l);
  19.                                 switch (leVtxc->GetMappingMode())
  20.                                 {
  21.                                 case FbxGeometryElement::eByControlPoint:
  22.                                         switch (leVtxc->GetReferenceMode())
  23.                                         {
  24.                                         case FbxGeometryElement::eDirect:
  25.                                                 break;
  26.                                         case FbxGeometryElement::eIndexToDirect:
  27.                                                 {
  28.                                                         int id = leVtxc->GetIndexArray().GetAt(lControlPointIndex);
  29.                                                 }
  30.                                                 break;
  31.                                         default:
  32.                                                 break; // other reference modes not shown here!
  33.                                         }
  34.                                         break;

  35.                                 case FbxGeometryElement::eByPolygonVertex:
  36.                                         {
  37.                                                 switch (leVtxc->GetReferenceMode())
  38.                                                 {
  39.                                                 case FbxGeometryElement::eDirect:
  40.                                                         break;
  41.                                                 case FbxGeometryElement::eIndexToDirect:
  42.                                                         {
  43.                                                                 int id = leVtxc->GetIndexArray().GetAt(vertexId);
  44.                                                                 FbxColor vColor = leVtxc->GetDirectArray().GetAt(id);                                                               
  45.                                                                 vBuffer[lControlPointIndex].color = D3DCOLOR_COLORVALUE(vColor.mRed,vColor.mGreen,vColor.mBlue,vColor.mAlpha);
  46.                                                         }
  47.                                                         break;
  48.                                                 default:
  49.                                                         break; // other reference modes not shown here!
  50.                                                 }
  51.                                         }
  52.                                         break;

  53.                                 case FbxGeometryElement::eByPolygon: // doesn't make much sense for UVs
  54.                                 case FbxGeometryElement::eAllSame:   // doesn't make much sense for UVs
  55.                                 case FbxGeometryElement::eNone:       // doesn't make much sense for UVs
  56.                                         break;
  57.                                 }
  58.                         }
  59.                 vertexId++;
  60.                 }
  61.         }
复制代码
这个代码里有几个地方需要关注一下:
获取每个三角形的索引:虽然这里解决了索引缓冲,但是觉得这并不是最佳的方法,所以帖子的标题中未提及索引缓冲,若果找到了更好的办法,会专门写个帖子介绍用法。
  1. //当前三角形是由哪三个点组成的
  2. int lControlPointIndex = pMesh->GetPolygonVertex(i, j);
  3. iBuffer[3*i+j] = lControlPointIndex;
复制代码
颜色的获取:下面这行代码的地方是颜色的获取,代码循环较长这里简单介绍一下:
  1. int id = leVtxc->GetIndexArray().GetAt(vertexId);
  2. FbxColor vColor = leVtxc->GetDirectArray().GetAt(id);                                                               
  3. vBuffer[lControlPointIndex].color = D3DCOLOR_COLORVALUE(vColor.mRed,vColor.mGreen,vColor.mBlue,vColor.mAlpha);
复制代码
pMesh->GetElementVertexColorCount()还没搞清楚到底起什么作用。但是如果模型中包含了颜色信息,这个地方就不为0.
通过索引vertexId就可以获取当前顶点id ,  leVtxc->GetIndexArray().GetAt(vertexId);
vColor = leVtxc->GetDirectArray().GetAt(id);    通过顶点id 获取当前顶点颜色。

这段代码里需要提及的是,作为FBX文件,并不保证组成的模型全部是三角形组成的。因此我们要判断。

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

GMT+8, 2024-4-29 18:50

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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