как работает порядок преобразования в пиопенгл? - PullRequest
0 голосов
/ 10 ноября 2019

Итак, я работаю над созданием симуляции для некоторого робота, но преобразование вращения не преобразовалось, как я ожидал

в этом коде, каждая часть имеет родителя какой-то другой части, например, часть 3Родится в части 2, часть 2 - в части 1, а часть 1 имеет родительский идентификатор -1. это означает, что если любое преобразование, которое выполняет часть 1, другое также преобразует части 2 и 3, и, например, если часть 2 является преобразованием, часть 1 не будет преобразована, но часть 3 будет преобразована. -1 - конец родительского элемента, поэтому у части с идентификатором -1 нет родителя (базы)

, чтобы сделать это, сначала я преобразую часть i, затем, если часть i имеет родителя (c. part [0] [pe] .parent! = - 1), где pe - это тот, кто преобразует часть, часть i будет продолжать преобразовываться родителем родительского элемента, пока parent = -1 (рекурсивный)

def transformation_0(no_servo):
    glTranslate(c.part[0] [no_servo].coordinate_of_servo_axis.elemen[0][0]+tx/20, c.part[0][no_servo].coordinate_of_servo_axis.elemen[1][0]+ty/20, c.part[0][no_servo].coordinate_of_servo_axis.elemen[2][0]-zpos)
    if(no_servo==0 or no_servo==3 or no_servo==4 or no_servo==9 or no_servo==10 or no_servo==16 or no_servo==17 or no_servo==20 or no_servo==21 or no_servo==22 or no_servo==23):
        glRotatef(servo_rotation[no_servo],1,0,0)
    elif(no_servo==2 or no_servo==7 or no_servo==8 or no_servo==13 or no_servo==14 or no_servo==15):
        glRotatef(servo_rotation[no_servo],0,1,0)
    elif(no_servo==1 or no_servo==5 or no_servo==6 or no_servo==11 or no_servo==12 or no_servo==18 or no_servo==19 or no_servo==24 or no_servo==25 or no_servo==26):
        glRotatef(servo_rotation[no_servo],0,0,1)
    glTranslate(-c.part[0][no_servo].coordinate_of_servo_axis.elemen[0][0]-tx/20, -c.part[0][no_servo].coordinate_of_servo_axis.elemen[1][0]-ty/20, -c.part[0][no_servo].coordinate_of_servo_axis.elemen[2][0]+zpos)

def transformation_1(pe): #pe is the id that transform the 3d model
    glTranslate(c.part[0][pe].coordinate_of_servo_axis.elemen[0][0]+tx/20, c.part[0][pe].coordinate_of_servo_axis.elemen[1][0]+ty/20, c.part[0][pe].coordinate_of_servo_axis.elemen[2][0]-zpos)
    if(pe==0 or pe==3 or pe==4 or pe==9 or pe==10 or pe==16 or pe==17 or pe==20 or pe==21 or pe==22 or pe==23):
    glRotatef(servo_rotation[pe],1,0,0)
    elif(pe==2 or pe==7 or pe==8 or pe==13 or pe==14 or pe==15):
    glRotatef(servo_rotation[pe],0,1,0)
    elif(pe==1 or pe==5 or pe==6 or pe==11 or pe==12 or pe==18 or pe==19 or pe==24 or pe==25 or pe==26):
        glRotatef(servo_rotation[pe],0,0,1)
    glTranslate(-c.part[0][pe].coordinate_of_servo_axis.elemen[0][0]-tx/20, -c.part[0][pe].coordinate_of_servo_axis.elemen[1][0]-ty/20, -c.part[0][pe].coordinate_of_servo_axis.elemen[2][0]+zpos)
    if(c.part[0][pe].parent!=-1):
        transformation_1(c.part[0][pe].parent)

def transformation():
    for i in range(27):
        glLoadIdentity()
        transformation_0(i)
        if(c.part[0][i].parent!=-1):
            transformation_1(c.part[0][i].parent)
        glTranslate(tx/20., ty/20., - zpos)
        glCallList(part[i].gl_list)

Я ожидал, что трансформация станет такой https://imgur.com/YpPAwYc

, но вместо этого я получил https://imgur.com/V9mkvfP

так что я пытаюсь сделать это https://imgur.com/TeTuWtD

[править] о да, я забыл упомянуть, у верхней части есть родитель нижней части

Может кто-нибудь помочь мне объяснить, что на самом деле происходит с преобразованием, пожалуйста

...