查看: 1966|回复: 23

osg::Geometry画一个长方形怎么无果呢???

[复制链接]

该用户从未签到

发表于 2014-9-3 12:03:00 | 显示全部楼层 |阅读模式
#include "stdafx.h"
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/geode>
#include <osg/LineWidth>
osg::ref_ptr<osg::Vec3Array> m_VertexV3a;


void DrawAreaWithType(int PolygonMode,osg::Geometry* PolygonGeometry,osg::StateSet* PolygonStateset)
{
        PolygonStateset->setMode(GL_BLEND,osg::StateAttribute::ON);
        PolygonStateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
        PolygonStateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF|osg::StateAttribute:ROTECTED);
        osg::ref_ptr <osg:ineWidth> LineSize = new osg::LineWidth;
        LineSize ->setWidth(2.0) ;      
        PolygonStateset->setAttributeAndModes(LineSize.get(),osg::StateAttribute::ON);

        PolygonGeometry->setStateSet(PolygonStateset);
        PolygonGeometry->setVertexArray(m_VertexV3a);
        PolygonGeometry->setTexCoordArray(0,m_VertexV3a);
        PolygonGeometry->addPrimitiveSet(new osg:rawArrays(PolygonMode,0,m_VertexV3a->size()));

        osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;  
        osg::Vec4 color(0.2,0.2,0.2,0.8);
        colors->push_back(color);
        PolygonGeometry->setColorArray(colors);  
        PolygonGeometry->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);  

        osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
        osg::Vec3 normal = osg::Z_AXIS;  
        normals->push_back(normal);  
        PolygonGeometry->setNormalArray(normals.get());  
        PolygonGeometry->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);
}


int _tmain(int argc, _TCHAR* argv[])
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
        osg::ref_ptr<osg::Group> g_Root = new osg::Group;
        osg::ref_ptr<osg::Node> pNode = new osg::Node;

        if(!pNode)
                return 0;
        m_VertexV3a = new osg::Vec3Array;
        m_VertexV3a->push_back(osg::Vec3(-0.1f,0.1f,-0.1f));
        m_VertexV3a->push_back(osg::Vec3(0.1f,0.1f,-0.1f));
        m_VertexV3a->push_back(osg::Vec3(0.1f,0.1f,0.1f));
        m_VertexV3a->push_back(osg::Vec3(-0.1f,0.1f,0.1f));
        osg::Geometry* PolygonGeometry = new osg::Geometry;
        osg::StateSet* PolygonStateset = new osg::StateSet;
        DrawAreaWithType(osg::PrimitiveSet::POLYGON,PolygonGeometry,PolygonStateset);
        g_Root->addChild(pNode);
        viewer->setSceneData(g_Root);
        viewer->run();
        return 0;
}

该用户从未签到

发表于 2014-9-9 16:06:06 | 显示全部楼层
。。你的geometry添加到node里面了么。。。

该用户从未签到

 楼主| 发表于 2014-9-13 14:38:32 | 显示全部楼层
buaahc 发表于 2014-9-9 16:06
。。你的geometry添加到node里面了么。。。

哥们 会模板测试融合吗

该用户从未签到

发表于 2014-9-15 11:16:45 | 显示全部楼层
这程序里面用到了模板融合?模板融合会点,呵呵

该用户从未签到

 楼主| 发表于 2014-9-18 22:19:09 | 显示全部楼层
buaahc 发表于 2014-9-15 11:16
这程序里面用到了模板融合?模板融合会点,呵呵

下面实现哪里不对呀,咋没效果呢???


  1.          osg::ref_ptr<osg::Geode> m_clipPlane = new osg::Geode;
  2.         (主节点)m_Group->addChild(m_clipPlane);
  3.          osg::ref_ptr<osg::Geometry> top_cap = new osg::Geometry;
  4.          m_clipPlane->addDrawable(top_cap);
  5.          top_cap->setVertexArray(pts);

  6.          osg::Vec4Array* colors = new osg::Vec4Array;
  7.          colors->push_back(osg::Vec4(1,0,0,1));
  8.          top_cap->setColorArray(colors);
  9.          top_cap->setColorBinding(osg::Geometry::BIND_OVERALL);

  10.          top_cap->addPrimitiveSet( new osg::DrawArrays(
  11.                  osg::PrimitiveSet::LINE_LOOP,
  12.                  0,pts->size()));

  13.          osgUtil::Tessellator tess;
  14.          tess.setTessellationType( osgUtil::Tessellator::TESS_TYPE_GEOMETRY );
  15.          tess.setWindingType( osgUtil::Tessellator::TESS_WINDING_POSITIVE );
  16.          tess.retessellatePolygons( *(top_cap.get()) );

  17.          osg::Stencil* stencil = new osg::Stencil;
  18.          stencil->setFunction(osg::Stencil::ALWAYS, 1, ~0u);
  19.          stencil->setOperation(osg::Stencil::KEEP, osg::Stencil::KEEP, osg::Stencil::INCR);
  20.          int ref = stencil->getFunctionRef();
  21.          unsigned int mask = stencil->getFunctionMask();
  22.          m_clipPlane->getOrCreateStateSet()->setAttributeAndModes(stencil, osg::StateAttribute::ON);
  23.          m_clipPlane->getOrCreateStateSet()->setAttributeAndModes(new osg::Depth(osg::Depth::LESS, 0, 1, false), osg::StateAttribute::ON);
  24.          m_clipPlane->getOrCreateStateSet()->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);
  25.          m_clipPlane->getOrCreateStateSet()->setAttributeAndModes(new osg::ColorMask(false, false, false, false));
  26.          m_clipPlane->setCullingActive(false);
  27.          m_clipPlane->getOrCreateStateSet()->setRenderBinDetails(-9, "RenderBin");


  28.          osg::Geode* clearDepthNode = new osg::Geode;
  29.          clearDepthNode->addDrawable(new osgAPEx::ClearDrawable(GL_DEPTH_BUFFER_BIT));
  30.          clearDepthNode->getOrCreateStateSet()->setRenderBinDetails(-8, "RenderBin");
  31.          (主节点)m_Group->addChild(clearDepthNode);

  32.          stencil = new osg::Stencil;
  33.          stencil->setFunction(osg::Stencil::NOTEQUAL, 1, 1);
  34.          (地球节点)m_Earth->getOrCreateStateSet()->setAttributeAndModes(stencil, osg::StateAttribute::ON);        
复制代码

该用户从未签到

发表于 2014-9-19 11:17:05 | 显示全部楼层
本帖最后由 buaahc 于 2014-9-19 16:33 编辑

没说清楚要实现什么效果?一般使用模板测试基本上是实现:当绘制一个图形A时,使用另一个图形B在绘制的A上形成镂空效果(说的有点笼统~~),比如绘制一块方形面板,然后在面板中心有一个T形状(或者任意形状)的镂空,还有一个效果就是倒影,再说你这个代码也不全,我也不好调试,关于模板测试方面的可以看osgreflect这个例子,很详细

该用户从未签到

 楼主| 发表于 2014-9-22 22:56:13 | 显示全部楼层
buaahc 发表于 2014-9-19 11:17
没说清楚要实现什么效果?一般使用模板测试基本上是实现:当绘制一个图形A时,使用另一个图形B在绘制的A上 ...

谢谢,看样子你也一定会example shader的柏林噪声了?

该用户从未签到

 楼主| 发表于 2014-9-24 13:13:09 | 显示全部楼层
buaahc 发表于 2014-9-15 11:16
这程序里面用到了模板融合?模板融合会点,呵呵

返回值什么意思
/*
   In what follows "alpha" is the weight when the sum is formed.
   Typically it is 2, As this approaches 1 the function is noisier.
   "beta" is the harmonic scaling/spacing, typically 2.
*/

double PerlinNoise1D(double x,double alpha,double beta,int n)
{
   int i;
   double val,sum = 0;
   double p,scale = 1;

   p = x;
   for (i=0;i<n;i++) {
      val = noise1(p);
      sum += val / scale;
      scale *= alpha;
      p *= beta;
   }
   return(sum);
}

该用户从未签到

发表于 2014-9-26 10:55:42 | 显示全部楼层
返回值是一维柏林噪声,柏林噪声是一系列不同倍频的普通噪声函数相互叠加构成,不同倍频的普通噪声函数的规律是振幅递减,频率叠加(每一个被叠加函数的振幅是前者的一半,频率是前者的两倍,以此类推),不过一般叠加3-5次就足够,普通噪声函数都是以非负整数为参数值,所以中间还牵扯到平滑函数,插值函数(实数)等等,下面链接你需要仔细研究一下,原理就是我上面说的,很简单~~
http://www.cnblogs.com/Memo/archive/2008/09/08/1286963.html

该用户从未签到

 楼主| 发表于 2014-9-26 16:14:53 | 显示全部楼层
buaahc 发表于 2014-9-26 10:55
返回值是一维柏林噪声,柏林噪声是一系列不同倍频的普通噪声函数相互叠加构成,不同倍频的普通噪声函数的规 ...

这注释对吗???

double PerlinNoise1D(double x,double alpha,double beta,int n)
{
   int i;
   double val,sum = 0;
   double p,scale = 1;

   p = x;
   for (i=0;i<n;i++) {//叠加次数
      val = noise1(p);//一次插值点
      sum += val / scale;//每一个被叠加函数的振幅是前者的一半
      scale *= alpha; //波长
      p *= beta;//频率是前者的两倍
   }
   return(sum);
}

该用户从未签到

发表于 2014-9-29 09:27:37 | 显示全部楼层
理解的很到位~,但是这个函数是使用val/scale,使用时要注意参数的设置,波长递减需要设置alpah大于1,反之就是波长叠加

该用户从未签到

 楼主| 发表于 2014-10-2 21:17:02 | 显示全部楼层
buaahc 发表于 2014-9-29 09:27
理解的很到位~,但是这个函数是使用val/scale,使用时要注意参数的设置,波长递减需要设置alpah大于1,反之 ...

哦,这样。大哥计算纹理坐标与自动生成纹理坐标有啥区别?

该用户从未签到

发表于 2014-10-9 14:33:04 | 显示全部楼层
oirrm 发表于 2014-10-2 21:17
哦,这样。大哥计算纹理坐标与自动生成纹理坐标有啥区别?

所谓自动生成纹理坐标,不过是opengl内置的几种纹理坐标生成算法,当然我们一般按照自己的需求和算法为每个顶点设置纹理坐标

该用户从未签到

 楼主| 发表于 2014-10-10 11:19:04 | 显示全部楼层
本帖最后由 oirrm 于 2014-10-15 09:16 编辑
buaahc 发表于 2014-10-9 14:33
所谓自动生成纹理坐标,不过是opengl内置的几种纹理坐标生成算法,当然我们一般按照自己的需求和算法为每 ...


空间多边形纹理坐标计算中的v1 -= vec2 * dot是什么意思。。。
       已经有坐标前三个点
       已经有纹理前三个点



该用户从未签到

发表于 2014-10-10 14:59:55 | 显示全部楼层
你应该说明白你想怎么做,一下子搞这么一大堆 纯数学代码,谁能给你挨着看。。。。

该用户从未签到

 楼主| 发表于 2014-10-10 15:30:16 | 显示全部楼层
本帖最后由 oirrm 于 2014-10-10 22:30 编辑
buaahc 发表于 2014-10-10 14:59
你应该说明白你想怎么做,一下子搞这么一大堆 纯数学代码,谁能给你挨着看。。。。


根据空间坐标计算空间多边形的纹理坐标。。。

该用户从未签到

 楼主| 发表于 2014-10-15 09:23:38 | 显示全部楼层
buaahc 发表于 2014-10-10 14:59
你应该说明白你想怎么做,一下子搞这么一大堆 纯数学代码,谁能给你挨着看。。。。

空间多边形纹理坐标计算中的v1 -= vec2 * dot是什么意思。。。
坐标前三个点(v1,v2,v3)的平面向量vec1 vec2

vec2.normalize();
float dot = vec1 * vec2;
v1 -= vec2 * dot;  //这步什么意思 ?
vec1 = v1 - v0; //这步什么意思?
len1 = vec1.length();

纹理前三个点(tv1,tv2,tv3)的平面向量tvec1,tvec2
tv1 -= tvec2 * dot; //这步什么意思 ?
tvec1 = tv1 - tv0; //这步什么意思 ?
tvec1 /= len1;

该用户从未签到

发表于 2014-10-16 17:02:54 | 显示全部楼层
你所写的代码的好多变量都没有说明清楚,v0是什么,vec2是什么,坐标前三个点(v1,v2,v3)的平面向量vec1 vec2,没有交代v0,也没有交代vec2,不过按照vec2.normalize();float dot = vec1 * vec2;v1 -= vec2 * dot;得到的应该是v1在vec2上的垂线C:\Users\Administrator\Desktop\1.png
1.png

该用户从未签到

 楼主| 发表于 2014-10-17 13:03:19 | 显示全部楼层
本帖最后由 oirrm 于 2014-10-17 23:22 编辑
buaahc 发表于 2014-10-16 17:02
你所写的代码的好多变量都没有说明清楚,v0是什么,vec2是什么,坐标前三个点(v1,v2,v3)的平面向量vec1 vec ...


四边形顶点v0,v1,v2,v3坐标计算四边形纹理坐标

四边形坐标前三个点(v0,v1,v2)的平面向量vec1 vec2
v0 v1 v2分别是四边形左边起的前三个点

四边形纹理前三个点(tv0,tv1,tv2)的平面向量tvec1 tvec2
tv0,tv1,tv2分别是四边形纹理左边起的前三个点

vec2.normalize();
float dot = vec1 * vec2;
vec1 -= vec2 * dot;  //得到的应该是v1在vec2上的垂线,对吧
vec1 -=  v0; //这步什么意思???
len1 = vec1.length();

tvec1 -= tvec2 * dot;
tvec1 -=  tv0;
tvec1 /= len1; //这步什么意思 ???
vec1.normalize();

osg::Vec3 vec = v3 - v0;
float dot1 = vec * vec1;//这俩个d1,d2的意思是顶点坐标投影到纹理坐标的???
float dot2 = vec * vec2;
osg::Vec2 t4 = tv0 + tvec1 * dot1 + tvec2 * dot2;三个向量相加求第四个纹理坐标点

该用户从未签到

 楼主| 发表于 2014-10-20 23:36:09 | 显示全部楼层
buaahc 发表于 2014-10-16 17:02
你所写的代码的好多变量都没有说明清楚,v0是什么,vec2是什么,坐标前三个点(v1,v2,v3)的平面向量vec1 vec ...

??????????????

该用户从未签到

发表于 2014-10-21 08:59:07 | 显示全部楼层
本帖最后由 buaahc 于 2014-10-21 09:02 编辑

关于向量的算法你不会演算纸画一下么,上个帖子已经给你提示!

该用户从未签到

 楼主| 发表于 2014-10-21 10:44:02 | 显示全部楼层
buaahc 发表于 2014-10-21 08:59
关于向量的算法你不会演算纸画一下么,上个帖子已经给你提示!

老师我推算过,只是不确定对不对呀。。。不是打着问号呢。。。

该用户从未签到

发表于 2014-10-21 14:23:25 | 显示全部楼层
本帖最后由 buaahc 于 2014-10-21 14:27 编辑

你这个算法我不知道对不对
我只按照自己的理解解释吧。。。
vec1 -= vec2 * dot;  //得到的应该是v1在vec2上的垂线,对吧。(这句我已经回答过了)
vec1 -=  v0; //这步什么意思???(画一下图 一看便知)
tvec1 /= len1; //这步什么意思 ???(使用向量的纹理坐标除以其长度得到应该是向量方向上单位长度所具有的纹理坐标大小)
float dot1 = vec * vec1;//这俩个d1,d2的意思是顶点坐标投影到纹理坐标的???(这两句是计算vec分别在vec1,vec2方向上投影的长度,应该是用作加权系数)
float dot2 = vec * vec2;

该用户从未签到

 楼主| 发表于 2014-10-24 17:33:19 | 显示全部楼层
buaahc 发表于 2014-10-21 14:23
你这个算法我不知道对不对
我只按照自己的理解解释吧。。。
vec1 -= vec2 * dot;  //得到的应该是v1在vec ...

float dot1 = vec * vec1;//这两句是计算vec分别在vec1,vec2方向上投影的长度,应该是用作加权系数
float dot2 = vec * vec2;
osg::Vec2 t4 = tv0 + tvec1 * dot1 + tvec2 * dot2;//???dot1、dot2加权系数啊???tvec1 * dot1 、tvec2 * dot2不是投影向量的求法吗???
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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