zoukankan      html  css  js  c++  java
  • 折腾了两天的拾取操作。。。

     啊哈,折腾了两天opengl上的拾取操作,总算是找到问题了。

      一开始是能拾取的但是selectbuffer中的记录总是不对,开始还以为只是拾取函数出问题了,然后仔细看了遍红宝书,按照红宝书中的步骤走了一遍,还是出错。。。然后就开始考虑是不是之前用了glulookat视图变换的问题,索性不用这个函数了,也就是视图变换采用默认,还是出错。。。然后不断的改代码,不断地debug。。。终于找到问题了,丫的,在

    gluPickMatrix(point.x,viewport[3]-point.y,5.0,5.0,viewport);
    gluPerspective(45,(double)m_wide/(double)m_heigth,0.1,2000);

    这两个函数之后的DrawPoint函数之前,不能有任何矩阵操作。 = =,这句话貌似有点费解,详细说下什么意思吧

    我的render函数是RenderScene,里面有一些DrawPoint、DrawAxes等等的东西,假如我在DrawPoint之前有平移、旋转之类的操作,gluPerspective之后再进行DrawPoint拾取的话,拾取的射线就不会经过鼠标点击的像素位置,为啥哩,因为渲染的时候我平移了呀,而拾取的时候没有这些平移,当然出问题啦。

      话说有必要实现一遍软件光栅化啊,顿时感觉基础不牢地动山摇。。。话说OpenGL的固定管线真难用T T

     1         GLuint selectbuf [512];
     2     GLint hits;
     3     GLint viewport [4];
     4     glGetIntegerv(GL_VIEWPORT,viewport);
     5     glSelectBuffer(512,selectbuf);
     6     (void)glRenderMode(GL_SELECT);
     7     glInitNames();
     8     glPushName(0);
     9     glMatrixMode(GL_PROJECTION);
    10     glPushMatrix();
    11     glLoadIdentity();
    12     gluPickMatrix(point.x,viewport[3]-point.y,5.0,5.0,viewport);
    13     gluPerspective(45.0f, (double)m_wide/(double)m_heigth,0.1,2000); 
    14     DrawPoint(GL_SELECT);
    15     glMatrixMode(GL_PROJECTION);
    16     glPopMatrix();
    17     glFlush();
    18     hits = glRenderMode(GL_RENDER);
    19     ProcessSelect(hits,selectbuf);
    20     glMatrixMode(GL_MODELVIEW);        

       然后加上glulookat之后,不进行变换的话没问题,假如旋转出问题,直接不用glulookat了,问题也就是在DrawPoint之前,RenderScene之后不能有平移之类的东西。。。。

  • 相关阅读:
    四月⑨日
    4月⑦日
    4月6日
    四月⑧日
    第一天上课
    modelsim的do文件
    SCCB协议
    FPGA之VGA控制
    FPGA常用术语
    乘法器之六(硬件乘法器)
  • 原文地址:https://www.cnblogs.com/AZ-ZK/p/4205922.html
Copyright © 2011-2022 走看看