查看: 2942|回复: 23

创建简单的立方体模型一半是黑色

[复制链接]

该用户从未签到

发表于 2012-8-6 20:42:04 | 显示全部楼层 |阅读模式
  1. int main( int argc, char** argv )
  2. {
  3.     osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(8);
  4.     (*vertices)[0].set( 0.0f, 0.0f, 0.0f );
  5.     (*vertices)[1].set( 1.0f, 0.0f, 0.0f );
  6.     (*vertices)[2].set( 1.0f, 0.0f, 1.0f );
  7.     (*vertices)[3].set( 0.0f, 0.0f, 1.0f );

  8.     (*vertices)[4].set( 0.0f, 1.0f, 0.0f );
  9.     (*vertices)[5].set( 1.0f, 1.0f, 0.0f );
  10.     (*vertices)[6].set( 1.0f, 1.0f, 1.0f );
  11.     (*vertices)[7].set( 0.0f, 1.0f, 1.0f );


  12.     osg::ref_ptr<osg::DrawElementsUInt> index = new osg::DrawElementsUInt(
  13.         osg::DrawElementsUInt::TRIANGLES);
  14.     index->push_back(0);index->push_back(1);index->push_back(2);
  15.     index->push_back(0);index->push_back(2);index->push_back(3);
  16.    
  17.     index->push_back(1);index->push_back(5);index->push_back(2);
  18.     index->push_back(2);index->push_back(5);index->push_back(6);

  19.     index->push_back(6);index->push_back(5);index->push_back(4);
  20.     index->push_back(6);index->push_back(4);index->push_back(7);

  21.     index->push_back(7);index->push_back(4);index->push_back(0);
  22.     index->push_back(7);index->push_back(0);index->push_back(3);

  23.     index->push_back(0);index->push_back(5);index->push_back(1);
  24.     index->push_back(0);index->push_back(4);index->push_back(5);

  25.     index->push_back(3);index->push_back(6);index->push_back(2);
  26.     index->push_back(3);index->push_back(7);index->push_back(6);

  27.     osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
  28.     normals->push_back(osg::Vec3(0,-1,0));
  29.     normals->push_back(osg::Vec3(0,-1,0));
  30.     normals->push_back(osg::Vec3(0,-1,0));
  31.     normals->push_back(osg::Vec3(0,-1,0));
  32.     normals->push_back(osg::Vec3(0,-1,0));
  33.     normals->push_back(osg::Vec3(0,-1,0));

  34.     normals->push_back(osg::Vec3(1,0,0));
  35.     normals->push_back(osg::Vec3(1,0,0));
  36.     normals->push_back(osg::Vec3(1,0,0));
  37.     normals->push_back(osg::Vec3(1,0,0));
  38.     normals->push_back(osg::Vec3(1,0,0));
  39.     normals->push_back(osg::Vec3(1,0,0));

  40.     normals->push_back(osg::Vec3(0,1,0));
  41.     normals->push_back(osg::Vec3(0,1,0));
  42.     normals->push_back(osg::Vec3(0,1,0));
  43.     normals->push_back(osg::Vec3(0,1,0));
  44.     normals->push_back(osg::Vec3(0,1,0));
  45.     normals->push_back(osg::Vec3(0,1,0));

  46.     normals->push_back(osg::Vec3(-1,0,0));
  47.     normals->push_back(osg::Vec3(-1,0,0));
  48.     normals->push_back(osg::Vec3(-1,0,0));
  49.     normals->push_back(osg::Vec3(-1,0,0));
  50.     normals->push_back(osg::Vec3(-1,0,0));
  51.     normals->push_back(osg::Vec3(-1,0,0));

  52.     normals->push_back(osg::Vec3(0,0,-1));
  53.     normals->push_back(osg::Vec3(0,0,-1));
  54.     normals->push_back(osg::Vec3(0,0,-1));
  55.     normals->push_back(osg::Vec3(0,0,-1));
  56.     normals->push_back(osg::Vec3(0,0,-1));
  57.     normals->push_back(osg::Vec3(0,0,-1));

  58.     normals->push_back(osg::Vec3(0,0,1));
  59.     normals->push_back(osg::Vec3(0,0,1));
  60.     normals->push_back(osg::Vec3(0,0,1));
  61.     normals->push_back(osg::Vec3(0,0,1));
  62.     normals->push_back(osg::Vec3(0,0,1));
  63.     normals->push_back(osg::Vec3(0,0,1));

  64.     osg::ref_ptr<osg::Geometry> cuboid = new osg::Geometry;
  65.     cuboid->setVertexArray(vertices);
  66.     cuboid->addPrimitiveSet(index);
  67.     cuboid->setNormalArray(normals);
  68.     cuboid->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);

  69.     osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  70.     geode->addDrawable(cuboid);

  71.     osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  72.     viewer->setSceneData(geode);
  73.     viewer->addEventHandler(new osgViewer::WindowSizeHandler);
  74.     return viewer->run();
  75. }
复制代码
今天测试创建简单的立方体,发现一个问题,模型有一半是黑色,不知道为什么?看了代码好像没什么问题,望达人指导一下?

该用户从未签到

发表于 2012-8-6 21:40:12 | 显示全部楼层
这应该是灯光设置的问题吧……系统默认的光照没找到的地方当然是黑色的!

该用户从未签到

 楼主| 发表于 2012-8-7 06:40:36 | 显示全部楼层
ramy612 发表于 2012-8-6 21:40
这应该是灯光设置的问题吧……系统默认的光照没找到的地方当然是黑色的!

如果是这样的话,那添加shape里的box就不会出现这种情况,如果加上SmoothingVisitor自动生成法线,也不会有这个问题,这很奇怪的

该用户从未签到

发表于 2012-8-7 07:54:43 | 显示全部楼层
顺时针  逆时针 反了

该用户从未签到

 楼主| 发表于 2012-8-7 08:55:37 | 显示全部楼层
liuzhiyu123 发表于 2012-8-7 07:54
顺时针  逆时针 反了

我都是按照逆时针画的呀?还请指出具体哪行代码?谢谢

该用户从未签到

发表于 2012-8-7 09:21:50 | 显示全部楼层
这不是很正常嘛!正面是亮着的,背面是黑的!把灯光关闭就全亮了

该用户从未签到

 楼主| 发表于 2012-8-7 09:50:51 | 显示全部楼层
本帖最后由 garyliyong 于 2012-8-7 09:51 编辑
木子匕 发表于 2012-8-7 09:21
这不是很正常嘛!正面是亮着的,背面是黑的!把灯光关闭就全亮了


我有12个三角面片,不知道你有没有测试一下?很多三角面片正面也是黑色的呀 关闭光照是可以,但是显示就不真实了

该用户从未签到

发表于 2012-8-7 10:24:12 | 显示全部楼层
看你画这个立方体可真够费劲的,黑色还是应该是发现向量设置的问题,好好检查一下你的每个顶点

该用户从未签到

发表于 2012-8-7 12:27:31 | 显示全部楼层
貌似逆时针画的三角形是正面,法线默认指向外部!,你很多三角形面片正面也是黑的!看看是不是法线错了吧!

该用户从未签到

 楼主| 发表于 2012-8-7 12:55:18 | 显示全部楼层
木子匕 发表于 2012-8-7 12:27
貌似逆时针画的三角形是正面,法线默认指向外部!,你很多三角形面片正面也是黑的!看看是不是法线错了吧!

这是一个很简单的单位立方体,顶点和法向是不会错的。看一下也不会花多长时间的,就是顶点坐标,顶点索引和顶点法向。而且顶点顺序和法向我都看过的。

该用户从未签到

发表于 2012-8-7 14:20:51 | 显示全部楼层
试了下!感觉怪怪的啊!一个面的2个三角形有的黑又得亮!不明所以

该用户从未签到

 楼主| 发表于 2012-8-7 20:26:24 | 显示全部楼层
这个问题就没人能解释下吗?

该用户从未签到

 楼主| 发表于 2012-8-8 20:21:38 | 显示全部楼层
array大侠呢?能不能解释下原因呀?在opengl里用顶点数组显示是没问题的

该用户从未签到

发表于 2012-8-9 08:03:04 | 显示全部楼层
cuboid->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
跟你前面设置的法线数组有冲突

该用户从未签到

 楼主| 发表于 2012-8-9 08:37:32 | 显示全部楼层
liuzhiyu123 发表于 2012-8-9 08:03
cuboid->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
跟你前面设置的法线数组有冲突

你能说得更清楚一点吗?你的意思是我有8个顶点,就只需要设8个法向吗?但是公共顶点的法向在不同的面上应该是不一样的呀
。那我的法向该如何设置绑定模式呢?

该用户从未签到

发表于 2012-8-9 10:33:46 | 显示全部楼层
BIND_PER_PRIMITIVE 就行 只需要对每个三角面进行一次法线设置

该用户从未签到

 楼主| 发表于 2012-8-10 08:56:05 | 显示全部楼层
liuzhiyu123 发表于 2012-8-9 10:33
BIND_PER_PRIMITIVE 就行 只需要对每个三角面进行一次法线设置

我试过了还是不行,不知道你有没有试一下?

该用户从未签到

发表于 2012-8-10 09:29:14 | 显示全部楼层
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(8);
        (*vertices)[0].set( 0.0f, 0.0f, 0.0f );
        (*vertices)[1].set( 1.0f, 0.0f, 0.0f );
        (*vertices)[2].set( 1.0f, 0.0f, 1.0f );
        (*vertices)[3].set( 0.0f, 0.0f, 1.0f );

        (*vertices)[4].set( 0.0f, 1.0f, 0.0f );
        (*vertices)[5].set( 1.0f, 1.0f, 0.0f );
        (*vertices)[6].set( 1.0f, 1.0f, 1.0f );
        (*vertices)[7].set( 0.0f, 1.0f, 1.0f );


        osg::ref_ptr<osg:rawElementsUInt> index = new osg::DrawElementsUInt(
                osg::DrawElementsUInt::TRIANGLES);
        index->push_back(0);index->push_back(1);index->push_back(2);
        index->push_back(0);index->push_back(2);index->push_back(3);

        index->push_back(1);index->push_back(5);index->push_back(2);
        index->push_back(2);index->push_back(5);index->push_back(6);

        index->push_back(6);index->push_back(5);index->push_back(4);
        index->push_back(6);index->push_back(4);index->push_back(7);

        index->push_back(7);index->push_back(4);index->push_back(0);
        index->push_back(7);index->push_back(0);index->push_back(3);

        index->push_back(0);index->push_back(5);index->push_back(1);
        index->push_back(0);index->push_back(4);index->push_back(5);

        index->push_back(3);index->push_back(6);index->push_back(2);
        index->push_back(3);index->push_back(7);index->push_back(6);

        osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
        normals->push_back(osg::Vec3(0,-1,0));
        normals->push_back(osg::Vec3(0,-1,0));
        //normals->push_back(osg::Vec3(0,-1,0));
        //normals->push_back(osg::Vec3(0,-1,0));
        //normals->push_back(osg::Vec3(0,-1,0));
        //normals->push_back(osg::Vec3(0,-1,0));

        normals->push_back(osg::Vec3(1,0,0));
        normals->push_back(osg::Vec3(1,0,0));
        //normals->push_back(osg::Vec3(1,0,0));
        //normals->push_back(osg::Vec3(1,0,0));
        //normals->push_back(osg::Vec3(1,0,0));
        //normals->push_back(osg::Vec3(1,0,0));

        normals->push_back(osg::Vec3(0,1,0));
        normals->push_back(osg::Vec3(0,1,0));
        //normals->push_back(osg::Vec3(0,1,0));
        //normals->push_back(osg::Vec3(0,1,0));
        //normals->push_back(osg::Vec3(0,1,0));
        //normals->push_back(osg::Vec3(0,1,0));

        normals->push_back(osg::Vec3(-1,0,0));
        normals->push_back(osg::Vec3(-1,0,0));
        //normals->push_back(osg::Vec3(-1,0,0));
        //normals->push_back(osg::Vec3(-1,0,0));
        //normals->push_back(osg::Vec3(-1,0,0));
        //normals->push_back(osg::Vec3(-1,0,0));

        normals->push_back(osg::Vec3(0,0,-1));
        normals->push_back(osg::Vec3(0,0,-1));
        //normals->push_back(osg::Vec3(0,0,-1));
        //normals->push_back(osg::Vec3(0,0,-1));
        //normals->push_back(osg::Vec3(0,0,-1));
        //normals->push_back(osg::Vec3(0,0,-1));

        normals->push_back(osg::Vec3(0,0,1));
        normals->push_back(osg::Vec3(0,0,1));
        //normals->push_back(osg::Vec3(0,0,1));
        //normals->push_back(osg::Vec3(0,0,1));
        //normals->push_back(osg::Vec3(0,0,1));
        //normals->push_back(osg::Vec3(0,0,1));

        osg::ref_ptr<osg::Geometry> cuboid = new osg::Geometry;
        cuboid->setVertexArray(vertices);
        cuboid->addPrimitiveSet(index);
        cuboid->setNormalArray(normals);
        cuboid->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE);

        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable(cuboid);

该用户从未签到

 楼主| 发表于 2012-8-16 11:03:41 | 显示全部楼层
liuzhiyu123 发表于 2012-8-10 09:29
osg::ref_ptr vertices = new osg::Vec3Array(8);
        (*vertices)[0].set( 0.0f, 0.0f, 0.0f );
        (*vertice ...

我按照你的方法试过了,确实可以,但是在比较弯曲的曲面这样画的话,会不光滑,比如说球体,所以还是得给每个顶点付法向量才行,这样的话代码该怎么写才行?

该用户从未签到

发表于 2012-8-16 11:06:45 | 显示全部楼层
考虑点重复吧,如果点数据不重复估计不能实现

该用户从未签到

 楼主| 发表于 2012-8-16 17:21:13 | 显示全部楼层
liuzhiyu123 发表于 2012-8-16 11:06
考虑点重复吧,如果点数据不重复估计不能实现

本来就是想用顶点数组减少顶点数的,真的没其它方法?

该用户从未签到

发表于 2012-8-21 09:50:38 | 显示全部楼层
使用SmoothingVisitor可以通过设置法线来模拟平滑的效果,如果要求更高的话,也许您得考虑细分着色器了

该用户从未签到

发表于 2013-6-21 11:28:36 | 显示全部楼层
我想问一下,这个立方体画出来之后,该怎么明确的给每个面着上指定的颜色?我3D太菜了

该用户从未签到

发表于 2013-6-24 18:19:08 | 显示全部楼层
setColorArray
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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