2017-09-14 7 views
2

2つの3Dキューブを異なる軸でどのように回転させるかを調べようとしています。私は2つの立方体を作成することができますが、両方の立方体を同じ方向に回転させることはできますが、異なる方向に回転しようとすると、2つの回転を混合して両方の立方体の回転軸を新しくするようです。また、私はPythonとObject Oriented Programmingについては初めてです。 ありがとうクラスとpyopenglを使用して異なる軸で2つのワイヤフレームキューブを回転する方法

ここは私のコードです。 glRotatefよう

import pygame 
from pygame.locals import * 
from OpenGL.GL import * 
from OpenGL.GLU import * 
import time 


class cubeClass: 
    def __init__(self): 

     self.rotation = [0,0,0,0] 

     self.verticies =[ 
      (1, -1, -1), 
      (1, 1, -1), 
      (-1, 1, -1), 
      (-1, -1, -1), 
      (1, -1, 1), 
      (1, 1, 1), 
      (-1, -1, 1), 
      (-1, 1, 1) 
      ] 

     self.edges = (
      (0,1), 
      (0,3), 
      (0,4), 
      (2,1), 
      (2,3), 
      (2,7), 
      (6,3), 
      (6,4), 
      (6,7), 
      (5,1), 
      (5,4), 
      (5,7) 
      ) 

    def cube(self): 

     glBegin(GL_LINES) 
     for self.edge in self.edges: 
      for self.vertex in self.edge: 
       glVertex3fv(self.verticies[self.vertex]) 
     glEnd() 

     glRotatef(self.rotation[0],self.rotation[1], 
        self.rotation[2],self.rotation[3]) 
     print(self.rotation) 

def main(): 
    pygame.init() 
    display = (800,600) 
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL) 

    gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) 

    cube1 = cubeClass() 
    cube1.rotation= [1,1,0,0] 

    cube2 = cubeClass() 
    cube2.rotation = [1,0,1,0] 

    glTranslatef(0.0,0.0, -5) 

    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 

     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 

     cube1.cube() 
     cube2.cube() 

     pygame.display.flip() 

     pygame.time.wait(10) 
     #time.sleep(.04) 

main()  
+0

@ Rabbid76ありがとうございました!これはまさに私が探していたglPushMatrix()とglPopMatrix()の情報と使用法です。 – Hats

+0

ようこそ。質問に対する回答が完全にあなたの問題を解決した場合は、回答を受け入れる必要があります(回答の左側にあるチェックマーク)。 – Rabbid76

答えて

1

OpenGLの操作は、OpenGL matrix stackの最上位の要素を操作します。 glPushMatrixglPopMatrixを使用して、マトリックスを押して、マトリックススタックからポップマトリックスを押します。 glMatrixModeは、行列演算の現在の行列を指定します。
Legacy OpenGL参照)
メッシュの位置と向きを定義するマトリックスは、モデルビューマトリックスです。
Transform the modelMatrixを参照)

あなたは各キューブに対して個別に回転を設定する必要があり、あなたは徐々に回転角度をインクリメントする必要があります。

def cube(self): 

    glMatrixMode(GL_MODELVIEW) 
    glPushMatrix() 
    glRotatef(self.rotation[0],self.rotation[1], 
       self.rotation[2],self.rotation[3]) 

    glBegin(GL_LINES) 
    for self.edge in self.edges: 
     for self.vertex in self.edge: 
      glVertex3fv(self.verticies[self.vertex]) 
    glEnd() 

    print(self.rotation) 

    glPopMatrix() 
    self.rotation[0] = self.rotation[0] + 1 
関連する問題