我要发帖 回复

中级会员

16

主题

111

积分

0

专家分

:

私信
发表时间 : 2006-11-12 08:42:57 | 浏览 : 3627    评论 : 12
我在同一个window下,加如了多个通道,想在屏幕上画opengl字符,但是只有一个
通道响应opengl的回调,请问应该怎么设置,谢谢:loveliness: :loveliness:

最近VR访客

99daodan 评论于2006-11-12 20:44:04
给各个通道加上各自的回调函数就可以 了。
和一个通道是一样的。
russelcrowe 评论于2006-11-13 07:38:17
楼上说的是不是在
notify里设置标志,执行不同的回调,还是说执行不同的notify,notify中的channel要怎样改
呢,谢谢
russelcrowe 评论于2006-11-13 07:40:57
我在程序中,动态改变channel的值,但是总是出错,刚运行就错,请问是什么原因?
superdemo 评论于2006-11-13 11:44:26
int configure()
{
//...
vpChannel *channelMirror = vpChannel::find("mirrorChannel");
vpChannel *channelDriver = vpChannel::find("driverChannel");
vpChannel *channelMy = vpChannel::find("myChannel");
assert(channelMirror);
channelMirror->addSubscriber(vsChannel::EVENT_POST_DRAW, this);  
assert(channelDriver);
channelDriver->addSubscriber(vsChannel::EVENT_POST_DRAW, this);   
channelMy->addSubscriber(vsChannel::EVENT_POST_DRAW, this);   
}

virtual void notify(vsChannel::Event, const vsChannel *channel,
        vrDrawContext *context)
    {
   vrStateMgr *stateMgr = context->getStateMgr();
   if(strcmp("mirrorChannel",channel->getName()) == 0)
   {
     //
   }
   if(strcmp("driverChannel",channel->getName()) == 0)
  {         
        //
}
  if(strcmp("myChannel",channel->getName()) == 0)
  {         
        //
  }
   
   
   }
obuil 评论于2006-11-13 21:48:05
vpChannel*  pChan->addSubscriber(vsChannel::EVENT_POST_DRAW, this);

可以把Subscriber 写成一个公共的类
每个通道都可以调用的
obuil 评论于2006-11-13 21:49:18
对 根superdemo 的思路一样
russelcrowe 评论于2006-11-14 08:00:24
感谢两位!
那在通道中画opengl线 的时候,是不是要去除vp中纹理对所画线的影响,怎样去除
因为线随着视点动的同时也变颜色,不知道是不是这个原因?
caoun1015 评论于2006-11-14 11:35:30
提示: 作者被禁止或删除 内容自动屏蔽
99daodan 评论于2006-11-15 21:45:17
notify里面加一个判断即可。
看传来的参数是哪个通道
russelcrowe 评论于2006-11-16 14:24:45
通道里的参数vrDrawContext *context是什么结构的,我有需要从外面传来的参数,是要直接改notify 机构还是要全局量,我的代码
void ModelVega::notify(vsChannel::Event event, const vsChannel *channel,
vrDrawContext *context)
{

        vrStateMgr *stateMgr = context->getStateMgr();
         if(strcmp("planechannel",channel->getName()) == 0)
         {
         }
         if(strcmp("screenchannel",channel->getName()) == 0)
         {
         Planstate * pPlanState=pDataManage;
         double planpos[3]={pPlanState->Posg[0],pPlanState->Posg[1],pPlanState->Posg[2]};
         double planang[3]={pPlanState->Sitag[0],pPlanState->Sitag[1],pPlanState->Sitag[2]};

                glDisable(GL_FOG);

                //////////////
                glDisable(GL_TEXTURE_2D | GL_TEXTURE_1D);
                glDisable(GL_LIGHTING | GL_CULL_FACE);
                glShadeModel(GL_FLAT);
        ///////////////
       glDisable(GL_LIGHTING);   
       glDisable(GL_DEPTH_TEST);
     ////////////////////////////////////


            glLoadIdentity();
      
                   glTranslatef(0.000000,0,-5);



//////////////////////
                glPushMatrix();  
                glRotatef(-planang[2],0,0,1);

        ////////////////////////////////////////////////
                 glLineWidth(2.0f);
                 glColor3f(1,1,1);
          glBegin(GL_LINES);

            glVertex3f(-0.12,0,0);
                        glVertex3f(0.12,0,0);

            glVertex3f(0,0,0);  //-0.12
                        glVertex3f(0,0.12,0);
           
          //////////////
            glVertex3f(-0.06,-0.06,0);
                        glVertex3f(0.06,-0.06,0);

            glVertex3f(-0.06,-0.06,0);
                        glVertex3f(-0.06,0.06,0);

            glVertex3f(0.06,0.06,0);
                        glVertex3f(0.06,-0.06,0);

            glVertex3f(0.06,0.06,0);
                        glVertex3f(-0.06,0.06,0);

          glEnd();
        glPopMatrix();
/////////////////////////////////////////////////
        {
                int i;
                glPushMatrix();
        ////////////////////////////////////////////////
                 glLineWidth(1.0f);
                 glColor3f(0,1,0);
            for(i=-9;i<=9;i++)
                        {
            double Basey=-planang[1]/100;
                        double cty=Basey+i*0.1;
                       
                 if(i==0)
                                   glLineWidth(2.0f);
                                 else
                       glLineWidth(1.0f);

                                if(cty>-0.5&&cty<0.5)
                                {
                          glBegin(GL_LINES);
                                glVertex3f(-0.3+abs(i)*0.018,cty,0);
                                glVertex3f(0.3-abs(i)*0.018,cty,0);
              glEnd();

                                }
                        }

            glPopMatrix();
        }



    ///////////////////////
       glEnable(GL_DEPTH_TEST);
          // glEnable(GL_LIGHTING);

         }


//vpChannel *  pChan->addSubscriber(vsChannel::EVENT_POST_DRAW, this);
                 
glPushAttrib(GL_ALL_ATTRIB_BITS);
OpenGLDisp(pDataManageVega);
glPopAttrib();

}

请问怎么修改呢,谢谢!!:loveliness:

[ 本帖最后由 russelcrowe 于 2006-11-16 02:27 PM 编辑 ]
russelcrowe 评论于2006-11-17 08:40:59
大家帮帮忙
superdemo 评论于2006-11-17 13:05:37
每个通道都addSubscriber();在每个通道回调里都定制绘制代码,不是就满足你的题目要求了?
if(strcmp("planechannel",channel->getName()) == 0)
{
context->pushElements(true);
// to do plane draw
context->pushElements(false);
}

if(strcmp("screenchannel",channel->getName()) == 0)
{
context->pushElements(true);
// to do screen draw
context->pushElements(false);
}

至于外面传来的参数,全局或类的成员变量,看你自己处理结构和流层了.

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-3-4 05:00 PM

返回顶部