вращающаяся модель при обновлении цвета - PullRequest
0 голосов
/ 09 августа 2011

В OpenGL я рисую дерево (состоящее из линий), подобное структуре (нейроны), и, основываясь на активности, я применяю цвет к каждой из ветвей дерева.Каждая часть ветви может иметь различный цвет в экземпляре.Я веду учет цвета в экземпляре, соответствующем ветви.

Я могу вращать (изменяя матрицу вида модели) дерево.Я вижу изменение цвета (активность) на ветках при обновлении.

Однако я не могу вращать дерево, когда происходит изменение цвета.(ротация видна после полного обновления) Это также верно для перевода модели, которая не может быть переведена во время обновления.

Как мне это сделать, чтобы увидеть их одновременно?

Я вызываю функцию updateViz для обновления цветов.

def render(self):
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    self.renderAxis()   #draws 3 axes at origin
    for obj in self.vizObjects:
        glPushMatrix()
        glColor(obj.r, obj.g, obj.b)
        glLineWidth(2)
        glBegin(GL_LINES)
        glVertex3f(obj.l_coords[0],obj.l_coords[1],obj.l_coords[2])
        glVertex3f(obj.l_coords[3],obj.l_coords[4],obj.l_coords[5])
        glEnd()     
        glPopMatrix()

def updateViz(self,vals):
    inds = digitize(vals,colrMapVals)
    for i in range(0,len(self.vizObjects)):
        self.vizObjects[i].r,self.vizObjects[i].g,self.vizObjects[i].b= colorMap[inds[i]-1]

def translate(self, _trans):
    self.makeCurrent()
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslated(_trans[0], _trans[1], _trans[2])
    glMultMatrixd(self.modelview_matrix_)
    self.modelview_matrix_ = glGetDoublev(GL_MODELVIEW_MATRIX)
    self.translate_vector_[0] = self.modelview_matrix_[3][0]
    self.translate_vector_[1] = self.modelview_matrix_[3][1]
    self.translate_vector_[2] = self.modelview_matrix_[3][2]

def rotate(self, _axis, _angle):
    #self.modelview_matrix_ = glGetDoublev(GL_MODELVIEW_MATRIX)
    t = [self.modelview_matrix_[0][0] * self.center_[0] +
         self.modelview_matrix_[1][0] * self.center_[1] +
         self.modelview_matrix_[2][0] * self.center_[2] +
         self.modelview_matrix_[3][0],
         self.modelview_matrix_[0][1] * self.center_[0] +
         self.modelview_matrix_[1][1] * self.center_[1] +
         self.modelview_matrix_[2][1] * self.center_[2] +
         self.modelview_matrix_[3][1],
         self.modelview_matrix_[0][2] * self.center_[0] +
         self.modelview_matrix_[1][2] * self.center_[1] +
         self.modelview_matrix_[2][2] * self.center_[2] +
         self.modelview_matrix_[3][2]]

    self.makeCurrent()
    glLoadIdentity()
    glTranslatef(t[0], t[1], t[2])
    glRotated(_angle, _axis[0], _axis[1], _axis[2])
    glTranslatef(-t[0], -t[1], -t[2])
    glMultMatrixd(self.modelview_matrix_)
    self.modelview_matrix_ = glGetDoublev(GL_MODELVIEW_MATRIX)

def keyPressEvent(self, ev):
    if (ev.key() == QtCore.Qt.Key_Left):
        self.translate([-0.25, 0.0, 0.0])
        self.updateGL()
    elif (ev.key() == QtCore.Qt.Key_Right):
        self.translate([0.25, 0.0, 0.0])
        self.updateGL()
    elif (ev.key() == QtCore.Qt.Key_A):
        self.rotate([1.0, 0.0, 0.0],2.0)
        self.updateGL()
    elif (ev.key() == QtCore.Qt.Key_Q):
        self.rotate([1.0, 0.0, 0.0],-2.0)
        self.updateGL()

Я использую PyQt4 и PyGLWidget

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Ваш код выглядит хорошо для меня.Я думаю, что проблема вызвана тем, как вы обновляете вращение и цвет.OpenGL - это конечный автомат, вы предоставляете ему всевозможную информацию (позиция вершины, цвет и т. Д.), И все визуализируется, поэтому УБЕДИТЕСЬ, что updateVis и translate / rotate вызываются КАЖДЫМ КАДРОМ.

возможно ваше вращение/ перевод зависит от механизма сигналов / событий Qt, и он не называется каждый кадр?

0 голосов
/ 10 августа 2011

OpenGL - это не граф сцены, в котором вы обновляете ротацию или перевод.Эти вызовы glRotate, glTranslate предназначены для вызова из функции рисования NOT в обработчике событий.Обновите некоторые переменные в обработчике событий, выполните перерисовку, а затем в коде чертежа вызовите glTranslate / glRotate в соответствии со значениями в переменной.

...