查看: 858|回复: 1

如何正确设置法向

[复制链接]

该用户从未签到

发表于 2015-4-15 17:51:23 | 显示全部楼层 |阅读模式
一个正方体,8个顶点,6个面如何较少的内存建立模型。
即只用8个顶点,6个法向来确定,其他使用索引。
下面是一个用24个顶点,24个法向,建立的,但是结果法向好像错了。
坐边的是错误的,右边的是正确的。
1.jpg
下面给出代码



  1. #include <osgGA/TrackballManipulator>
  2. #include <osg/PositionAttitudeTransform>
  3. #include <osgGA/GUIEventHandler>
  4. #include <osg/Material>
  5. #include <osg/ShapeDrawable>
  6. #include <osg/Geometry>
  7. #include <osg/Geode>
  8. #include <valarray>
  9. #include <osg/Light>
  10. #include <osg/LightSource>
  11. #include <osgViewer/Viewer>
  12. #include <osgViewer/ViewerEventHandlers>
  13. #include <osgGA/StateSetManipulator>


  14. #pragma comment(lib, "osgd.lib")
  15. #pragma comment(lib, "osgDBd.lib")
  16. #pragma comment(lib, "osgGAd.lib")
  17. #pragma comment(lib, "osgUtild.lib")
  18. #pragma comment(lib, "osgViewerd.lib")
  19. #pragma comment(lib, "osgManipulatord.lib")

  20. osg::Geode *createCube() {
  21.         // vertex array
  22.         osg::Vec3Array *vertexArray = new osg::Vec3Array();

  23.         // bottom front left
  24.         vertexArray->push_back(osg::Vec3(-1, -1, 0));
  25.         vertexArray->push_back(osg::Vec3(-1, -1, 0));
  26.         vertexArray->push_back(osg::Vec3(-1, -1, 0));
  27.         // bottom front right
  28.         vertexArray->push_back(osg::Vec3(+1, -1, 0));
  29.         vertexArray->push_back(osg::Vec3(+1, -1, 0));
  30.         vertexArray->push_back(osg::Vec3(+1, -1, 0));
  31.         // bottom back right
  32.         vertexArray->push_back(osg::Vec3(+1, +1, 0));
  33.         vertexArray->push_back(osg::Vec3(+1, +1, 0));
  34.         vertexArray->push_back(osg::Vec3(+1, +1, 0));
  35.         // bottom back left
  36.         vertexArray->push_back(osg::Vec3(-1, +1, 0));
  37.         vertexArray->push_back(osg::Vec3(-1, +1, 0));
  38.         vertexArray->push_back(osg::Vec3(-1, +1, 0));

  39.         // top front left
  40.         vertexArray->push_back(osg::Vec3(-1, -1, 2));
  41.         vertexArray->push_back(osg::Vec3(-1, -1, 2));
  42.         vertexArray->push_back(osg::Vec3(-1, -1, 2));
  43.         // top front right
  44.         vertexArray->push_back(osg::Vec3(+1, -1, 2));
  45.         vertexArray->push_back(osg::Vec3(+1, -1, 2));
  46.         vertexArray->push_back(osg::Vec3(+1, -1, 2));
  47.         // top back right
  48.         vertexArray->push_back(osg::Vec3(+1, +1, 2));
  49.         vertexArray->push_back(osg::Vec3(+1, +1, 2));
  50.         vertexArray->push_back(osg::Vec3(+1, +1, 2));
  51.         // top back left
  52.         vertexArray->push_back(osg::Vec3(-1, +1, 2));
  53.         vertexArray->push_back(osg::Vec3(-1, +1, 2));
  54.         vertexArray->push_back(osg::Vec3(-1, +1, 2));


  55.         // face array
  56.         osg::DrawElementsUInt *faceArray = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);

  57.         // bottom
  58.         faceArray->push_back(0); // face 1
  59.         faceArray->push_back(9);
  60.         faceArray->push_back(3);
  61.         faceArray->push_back(9); // face 2
  62.         faceArray->push_back(6);
  63.         faceArray->push_back(3);
  64.         // top
  65.         faceArray->push_back(21);  //face 3
  66.         faceArray->push_back(12);
  67.         faceArray->push_back(18);
  68.         faceArray->push_back(12);  //face 4
  69.         faceArray->push_back(15);
  70.         faceArray->push_back(18);
  71.         // left
  72.         faceArray->push_back(22);  //face 5
  73.         faceArray->push_back(10);
  74.         faceArray->push_back(13);
  75.         faceArray->push_back(10);  //face 6
  76.         faceArray->push_back(1);
  77.         faceArray->push_back(13);
  78.         // right
  79.         faceArray->push_back(16);  //face 7
  80.         faceArray->push_back(4);
  81.         faceArray->push_back(19);
  82.         faceArray->push_back(4);  //face 8
  83.         faceArray->push_back(7);
  84.         faceArray->push_back(19);
  85.         // front
  86.         faceArray->push_back(14);  //face 9
  87.         faceArray->push_back(2);
  88.         faceArray->push_back(17);
  89.         faceArray->push_back(2);   //face 10
  90.         faceArray->push_back(5);
  91.         faceArray->push_back(17);
  92.         // back
  93.         faceArray->push_back(20);  //face 11
  94.         faceArray->push_back(8);
  95.         faceArray->push_back(23);
  96.         faceArray->push_back(8);   //face 12
  97.         faceArray->push_back(11);
  98.         faceArray->push_back(23);

  99.         // normal array
  100.         osg::Vec3Array *normalArray = new osg::Vec3Array();
  101.         normalArray->push_back(osg::Vec3(0, 0, -1));
  102.         normalArray->push_back(osg::Vec3(0, -1, 0));
  103.         normalArray->push_back(osg::Vec3(+1, 0, 0));

  104.         normalArray->push_back(osg::Vec3(0, 0, -1));
  105.         normalArray->push_back(osg::Vec3(0, +1, 0));
  106.         normalArray->push_back(osg::Vec3(+1, 0, 0));

  107.         normalArray->push_back(osg::Vec3(0, 0, -1));
  108.         normalArray->push_back(osg::Vec3(0, +1, 0));
  109.         normalArray->push_back(osg::Vec3(-1, 0, 0));

  110.         normalArray->push_back(osg::Vec3(0, 0, -1));
  111.         normalArray->push_back(osg::Vec3(0, -1, 0));
  112.         normalArray->push_back(osg::Vec3(-1, 0, 0));

  113.         normalArray->push_back(osg::Vec3(0, 0, +1));
  114.         normalArray->push_back(osg::Vec3(0, -1, 0));
  115.         normalArray->push_back(osg::Vec3(+1, 0, 0));

  116.         normalArray->push_back(osg::Vec3(0, 0, +1));
  117.         normalArray->push_back(osg::Vec3(0, +1, 0));
  118.         normalArray->push_back(osg::Vec3(+1, 0, 0));

  119.         normalArray->push_back(osg::Vec3(0, 0, +1));
  120.         normalArray->push_back(osg::Vec3(0, +1, 0));
  121.         normalArray->push_back(osg::Vec3(-1, 0, 0));

  122.         normalArray->push_back(osg::Vec3(0, 0, +1));
  123.         normalArray->push_back(osg::Vec3(0, -1, 0));
  124.         normalArray->push_back(osg::Vec3(-1, 0, 0));

  125.         osg::Geometry *geometry = new osg::Geometry();
  126.         geometry->setVertexArray(vertexArray);

  127.         geometry->setNormalArray(normalArray);
  128.         geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
  129.         geometry->addPrimitiveSet(faceArray);
  130.         //创建颜色数组
  131.         osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();
  132.         //添加数据
  133.         vc->push_back(osg::Vec4(0.2, 0.8, 0.0, 0.5));
  134.         //设置颜色数组
  135.         geometry->setColorArray(vc.get());
  136.         //设置颜色的绑定方式为
  137.         geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

  138.         osg::Geode *cube = new osg::Geode();
  139.         cube->addDrawable(geometry);
  140.         return cube;
  141. }

  142. osg::Geode *CreateShape()
  143. {
  144.         osg::ref_ptr<osg::Geode> geode = new osg::Geode;


  145.         osg::ref_ptr<osg::ShapeDrawable> dd = new osg::ShapeDrawable(new osg::Box(osg::Vec3(10, 0,0), 2));

  146.         dd->setColor(osg::Vec4(0.2, 0.8, 0.0, 0.5));

  147.         geode->addDrawable(dd);

  148.         return geode.release();
  149. }

  150. int main(int argc, const char* argv[]) {       
  151.        
  152.         osgViewer::Viewer viewer;   

  153.         osg::ref_ptr<osg::Group> group = new osg::Group;
  154.         group->addChild(createCube());
  155.         group->addChild(CreateShape());
  156.         viewer.setSceneData(group);

  157.         viewer.addEventHandler(new osgViewer::StatsHandler());
  158.         viewer.addEventHandler(new osgViewer::WindowSizeHandler());
  159.         viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));

  160.         return viewer.run();
  161. }
复制代码

该用户从未签到

 楼主| 发表于 2015-5-22 11:50:50 | 显示全部楼层
不知道这样是不是就ok了。内存最少?


  1. osg::Geode *createCube() {
  2.         // vertex array
  3.         osg::Vec3Array *vertexArray = new osg::Vec3Array();

  4.         // bottom front left
  5.         vertexArray->push_back(osg::Vec3(-1, -1, 0));
  6.         // bottom front right
  7.         vertexArray->push_back(osg::Vec3(+1, -1, 0));
  8.         // bottom back right
  9.         vertexArray->push_back(osg::Vec3(+1, +1, 0));
  10.         // bottom back left
  11.         vertexArray->push_back(osg::Vec3(-1, +1, 0));
  12.         // top front left
  13.         vertexArray->push_back(osg::Vec3(-1, -1, 2));
  14.         // top front right
  15.         vertexArray->push_back(osg::Vec3(+1, -1, 2));
  16.         // top back right
  17.         vertexArray->push_back(osg::Vec3(+1, +1, 2));
  18.         // top back left
  19.         vertexArray->push_back(osg::Vec3(-1, +1, 2));


  20.         //创建颜色数组
  21.         osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();
  22.         osg::Geode *cube = new osg::Geode();
  23.         //添加数据
  24.         vc->push_back(osg::Vec4(0.2, 0.8, 0.0, 0.5));
  25.         {
  26.                 // bottom
  27.                 osg::Geometry *geometry = new osg::Geometry();
  28.                 geometry->setVertexArray(vertexArray);

  29.                 osg::Vec3Array *normalArray = new osg::Vec3Array();
  30.                 normalArray->push_back(osg::Vec3(0, 0, -1));

  31.                 geometry->setNormalArray(normalArray);
  32.                 geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);

  33.                 osg::DrawElementsUInt *faceArray = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
  34.                 faceArray->push_back(0); // face 1
  35.                 faceArray->push_back(1);
  36.                 faceArray->push_back(2);
  37.                 faceArray->push_back(2); // face 2
  38.                 faceArray->push_back(3);
  39.                 faceArray->push_back(0);

  40.                 geometry->addPrimitiveSet(faceArray);
  41.                 geometry->setColorArray(vc.get());
  42.                 geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
  43.                 cube->addDrawable(geometry);

  44.         }
  45.         {
  46.                 // top
  47.                 osg::Geometry *geometry = new osg::Geometry();
  48.                 geometry->setVertexArray(vertexArray);

  49.                 osg::Vec3Array *normalArray = new osg::Vec3Array();
  50.                 normalArray->push_back(osg::Vec3(0, 0, 1));
  51.                 geometry->setNormalArray(normalArray);
  52.                 geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
  53.                 // face array
  54.                 osg::DrawElementsUInt *faceArray = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
  55.                
  56.                 faceArray->push_back(4); // face 1
  57.                 faceArray->push_back(5);
  58.                 faceArray->push_back(6);
  59.                 faceArray->push_back(6); // face 2
  60.                 faceArray->push_back(7);
  61.                 faceArray->push_back(4);
  62.                 geometry->addPrimitiveSet(faceArray);
  63.                 geometry->setColorArray(vc.get());
  64.                 geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

  65.                 cube->addDrawable(geometry);
  66.         }
  67.         {
  68.                 // left
  69.                 osg::Geometry *geometry = new osg::Geometry();
  70.                 geometry->setVertexArray(vertexArray);

  71.                 osg::Vec3Array *normalArray = new osg::Vec3Array();
  72.                 normalArray->push_back(osg::Vec3(-1, 0, 0));
  73.                 geometry->setNormalArray(normalArray);
  74.                 geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
  75.                 // face array
  76.                 osg::DrawElementsUInt *faceArray = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);

  77.                 faceArray->push_back(0); // face 1
  78.                 faceArray->push_back(4);
  79.                 faceArray->push_back(7);
  80.                 faceArray->push_back(7); // face 2
  81.                 faceArray->push_back(3);
  82.                 faceArray->push_back(0);
  83.                 geometry->addPrimitiveSet(faceArray);
  84.                 geometry->setColorArray(vc.get());
  85.                 geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

  86.                 cube->addDrawable(geometry);
  87.         }
  88.         {
  89.                 // right
  90.                 osg::Geometry *geometry = new osg::Geometry();
  91.                 geometry->setVertexArray(vertexArray);

  92.                 osg::Vec3Array *normalArray = new osg::Vec3Array();
  93.                 normalArray->push_back(osg::Vec3(1, 0, 0));
  94.                 geometry->setNormalArray(normalArray);
  95.                 geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
  96.                 // face array
  97.                 osg::DrawElementsUInt *faceArray = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);

  98.                 faceArray->push_back(1); // face 1
  99.                 faceArray->push_back(2);
  100.                 faceArray->push_back(6);
  101.                 faceArray->push_back(6); // face 2
  102.                 faceArray->push_back(5);
  103.                 faceArray->push_back(1);
  104.                 geometry->addPrimitiveSet(faceArray);
  105.                 geometry->setColorArray(vc.get());
  106.                 geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

  107.                 cube->addDrawable(geometry);
  108.         }
  109.         {
  110.                 // front
  111.                 osg::Geometry *geometry = new osg::Geometry();
  112.                 geometry->setVertexArray(vertexArray);

  113.                 osg::Vec3Array *normalArray = new osg::Vec3Array();
  114.                 normalArray->push_back(osg::Vec3(0, -1, 0));
  115.                 geometry->setNormalArray(normalArray);
  116.                 geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
  117.                 // face array
  118.                 osg::DrawElementsUInt *faceArray = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);

  119.                 faceArray->push_back(0); // face 1
  120.                 faceArray->push_back(1);
  121.                 faceArray->push_back(5);
  122.                 faceArray->push_back(5); // face 2
  123.                 faceArray->push_back(4);
  124.                 faceArray->push_back(0);
  125.                 geometry->addPrimitiveSet(faceArray);
  126.                 geometry->setColorArray(vc.get());
  127.                 geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

  128.                 cube->addDrawable(geometry);
  129.         }
  130.         {
  131.                 // back
  132.                 osg::Geometry *geometry = new osg::Geometry();
  133.                 geometry->setVertexArray(vertexArray);

  134.                 osg::Vec3Array *normalArray = new osg::Vec3Array();
  135.                 normalArray->push_back(osg::Vec3(0, 1, 0));
  136.                 geometry->setNormalArray(normalArray);
  137.                 geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
  138.                 // face array
  139.                 osg::DrawElementsUInt *faceArray = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);

  140.                 faceArray->push_back(2); // face 1
  141.                 faceArray->push_back(3);
  142.                 faceArray->push_back(7);
  143.                 faceArray->push_back(7); // face 2
  144.                 faceArray->push_back(6);
  145.                 faceArray->push_back(2);
  146.                 geometry->addPrimitiveSet(faceArray);
  147.                 geometry->setColorArray(vc.get());
  148.                 geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

  149.                 cube->addDrawable(geometry);
  150.         }


  151.         return cube;
  152. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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