查看: 1333|回复: 6

求助:如何得到Array中的数据

[复制链接]

该用户从未签到

发表于 2014-6-18 17:06:11 | 显示全部楼层 |阅读模式
本帖最后由 tiandao011 于 2014-6-18 18:01 编辑

如下:
从Geometry节点中得到Array数组
如何从Array数组中得到Vec3fArray数据
以及Geometry中的组织方式等属性

  1.                 osg::ref_ptr<osg::Array> datas    = geometryj->getVertexArray();
复制代码

该用户从未签到

发表于 2014-6-19 09:09:19 | 显示全部楼层
你都已经得到数组指针了。。得到数据还不简单?datas->at(i)表示第i个顶点(当然是以0开始计数的)。

该用户从未签到

 楼主| 发表于 2014-6-20 07:48:47 | 显示全部楼层
本帖最后由 tiandao011 于 2014-6-20 17:31 编辑
JacaYang 发表于 2014-6-19 09:09
你都已经得到数组指针了。。得到数据还不简单?datas->at(i)表示第i个顶点(当然是以0开始计数的)。


谢谢·~~~~
好像Array没有at这个函数~~~~

该用户从未签到

发表于 2014-6-20 10:20:18 | 显示全部楼层
判断Array类型(vec3array,vec4array或索引等),然后转化到相应类型

该用户从未签到

 楼主| 发表于 2014-6-20 17:00:04 | 显示全部楼层
gis_wudi 发表于 2014-6-20 10:20
判断Array类型(vec3array,vec4array或索引等),然后转化到相应类型

大侠···怎么转换到相应类型~~~
能给个例子不··

该用户从未签到

 楼主| 发表于 2014-6-20 17:23:03 | 显示全部楼层
gis_wudi 发表于 2014-6-20 10:20
判断Array类型(vec3array,vec4array或索引等),然后转化到相应类型

通过查找Aaary找到了一个能用的
  1.     switch(array.getType())
  2.     {
  3.         case(Array::ByteArrayType):
  4.             {
  5.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  6.                 const ByteArray::ElementDataType* base = static_cast<const ByteArray::ElementDataType*>(array.getDataPointer());
  7.                 writeArrayAsInts(fw,&base[0], &base[array.getNumElements()]);
  8.                 return true;
  9.             }
  10.             break;
  11.         case(Array::ShortArrayType):
  12.             {
  13.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  14.                 const ShortArray::ElementDataType* base = static_cast<const ShortArray::ElementDataType*>(array.getDataPointer());
  15.                 writeArray(fw,&base[0], &base[array.getNumElements()]);
  16.                 return true;
  17.             }
  18.             break;
  19.         case(Array::IntArrayType):
  20.             {
  21.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  22.                 const IntArray::ElementDataType* base = static_cast<const IntArray::ElementDataType*>(array.getDataPointer());
  23.                 writeArray(fw,&base[0], &base[array.getNumElements()]);
  24.                 return true;
  25.             }
  26.             break;
  27.         case(Array::UByteArrayType):
  28.             {
  29.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  30.                 const UByteArray::ElementDataType* base = static_cast<const UByteArray::ElementDataType*>(array.getDataPointer());
  31.                 writeArrayAsInts(fw,&base[0], &base[array.getNumElements()]);
  32.                 return true;
  33.             }
  34.             break;
  35.         case(Array::UShortArrayType):
  36.             {
  37.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  38.                 const UShortArray::ElementDataType* base = static_cast<const UShortArray::ElementDataType*>(array.getDataPointer());
  39.                 writeArray(fw,&base[0], &base[array.getNumElements()]);
  40.                 return true;
  41.             }
  42.             break;
  43.         case(Array::UIntArrayType):
  44.             {
  45.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  46.                 const UIntArray::ElementDataType* base = static_cast<const UIntArray::ElementDataType*>(array.getDataPointer());
  47.                 writeArray(fw,&base[0], &base[array.getNumElements()]);
  48.                 return true;
  49.             }
  50.             break;
  51.         case(Array::Vec4ubArrayType):
  52.             {
  53.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  54.                 const Vec4ubArray::ElementDataType* base = static_cast<const Vec4ubArray::ElementDataType*>(array.getDataPointer());
  55.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  56.                 return true;
  57.             }
  58.             break;
  59.         case(Array::FloatArrayType):
  60.             {
  61.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  62.                 const FloatArray::ElementDataType* base = static_cast<const FloatArray::ElementDataType*>(array.getDataPointer());
  63.                 writeArray(fw,&base[0], &base[array.getNumElements()]);
  64.                 return true;
  65.             }
  66.             break;
  67.         case(Array::Vec2ArrayType):
  68.             {
  69.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  70.                 const Vec2Array::ElementDataType* base = static_cast<const Vec2Array::ElementDataType*>(array.getDataPointer());
  71.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  72.                 return true;
  73.             }
  74.             break;
  75.         case(Array::Vec3ArrayType):
  76.             {
  77.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  78.                 const Vec3Array::ElementDataType* base = static_cast<const Vec3Array::ElementDataType*>(array.getDataPointer());
  79.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  80.                 return true;
  81.             }
  82.             break;
  83.         case(Array::Vec4ArrayType):
  84.             {
  85.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  86.                 const Vec4Array::ElementDataType* base = static_cast<const Vec4Array::ElementDataType*>(array.getDataPointer());
  87.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  88.                 return true;
  89.             }
  90.             break;
  91.         case(Array::DoubleArrayType):
  92.             {
  93.                 int prec = fw.precision(15);
  94.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  95.                 const DoubleArray::ElementDataType* base = static_cast<const DoubleArray::ElementDataType*>(array.getDataPointer());
  96.                 writeArray(fw,&base[0], &base[array.getNumElements()]);
  97.                 fw.precision(prec);
  98.                 return true;
  99.             }
  100.             break;
  101.         case(Array::Vec2dArrayType):
  102.             {
  103.                 int prec = fw.precision(15);
  104.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  105.                 const Vec2dArray::ElementDataType* base = static_cast<const Vec2dArray::ElementDataType*>(array.getDataPointer());
  106.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  107.                 fw.precision(prec);
  108.                 return true;
  109.             }
  110.             break;
  111.         case(Array::Vec3dArrayType):
  112.             {
  113.                 int prec = fw.precision(15);
  114.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  115.                 const Vec3dArray::ElementDataType* base = static_cast<const Vec3dArray::ElementDataType*>(array.getDataPointer());
  116.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  117.                 fw.precision(prec);
  118.                 return true;
  119.             }
  120.             break;
  121.         case(Array::Vec4dArrayType):
  122.             {
  123.                 int prec = fw.precision(15);
  124.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  125.                 const Vec4dArray::ElementDataType* base = static_cast<const Vec4dArray::ElementDataType*>(array.getDataPointer());
  126.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  127.                 fw.precision(prec);
  128.                 return true;
  129.             }
  130.             break;
  131.         case(Array::Vec2sArrayType):
  132.             {
  133.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  134.                 const Vec2sArray::ElementDataType* base = static_cast<const Vec2sArray::ElementDataType*>(array.getDataPointer());
  135.                 writeArray(fw,&base[0], &base[array.getNumElements()], 3);
  136.                 return true;
  137.             }
  138.             break;
  139.         case(Array::Vec3sArrayType):
  140.             {
  141.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  142.                 const Vec3sArray::ElementDataType* base = static_cast<const Vec3sArray::ElementDataType*>(array.getDataPointer());
  143.                 writeArray(fw,&base[0], &base[array.getNumElements()], 2);
  144.                 return true;
  145.             }
  146.             break;
  147.         case(Array::Vec4sArrayType):
  148.             {
  149.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  150.                 const Vec4sArray::ElementDataType* base = static_cast<const Vec4sArray::ElementDataType*>(array.getDataPointer());
  151.                 writeArray(fw,&base[0], &base[array.getNumElements()], 1);
  152.                 return true;
  153.             }
  154.             break;
  155.         case(Array::Vec2bArrayType):
  156.             {
  157.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  158.                 const Vec2bArray::ElementDataType* base = static_cast<const Vec2bArray::ElementDataType*>(array.getDataPointer());
  159.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  160.                 return true;
  161.             }
  162.             break;
  163.         case(Array::Vec3bArrayType):
  164.             {
  165.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  166.                 const Vec3bArray::ElementDataType* base = static_cast<const Vec3bArray::ElementDataType*>(array.getDataPointer());
  167.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  168.                 return true;
  169.             }
  170.             break;
  171.         case(Array::Vec4bArrayType):
  172.             {
  173.                 fw<<array.className()<<" "<<array.getNumElements()<<std::endl;
  174.                 const Vec4bArray::ElementDataType* base = static_cast<const Vec4bArray::ElementDataType*>(array.getDataPointer());
  175.                 writeArray(fw,&base[0], &base[array.getNumElements()],1);
  176.                 return true;
  177.             }
  178.             break;
  179.         case(Array::ArrayType):
  180.         default:
  181.             return false;
  182.     }
  183. }
复制代码


然后
  1.                 const osg::Vec3Array::ElementDataType* base =
  2.                 static_cast<const osg::Vec3Array::ElementDataType*>(datas->getDataPointer());


  3.                 osg::ref_ptr<osg::Vec3Array> pts = new osg::Vec3Array;
  4.                 osg::Geometry::ArrayData type = geometryj->getVertexData();
  5.                 int Num = datas->getNumElements();
  6.                 int arraytype = datas->getType();
  7.                 for (int i = 0 ; i < Num ; i ++)
  8.                 {
  9.                         osg::Vec3f f = base[i];
  10.                 }
复制代码

应该可行吧····


是不是osg里面的强制转换都是靠着
const osg::Vec3Array::ElementDataType* base =
                static_cast<const osg::Vec3Array::ElementDataType*>(datas->getDataPointer());

这种啊·····

该用户从未签到

发表于 2014-6-25 09:38:59 | 显示全部楼层
tiandao011 发表于 2014-6-20 17:23
通过查找Aaary找到了一个能用的

这属于C++范畴,请查看类型转换相关内容
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表