0

X 軸で 1 つのオブジェクトを回転させようとしていますが、取得できません。

クラス Object 3D があります。

class Object3D():
   implements( IRenderizable )

   def __init__(self, parameters={} ):
     self.parameters = parameters
     self.ID= Engine().addObject3D()
     self.parent = None
     self.childrens =[]
     self.position = (parameters.get('POSITION') is None ) is True and  Vector4()     or parameters.get('POSITION')
     self.rotation = (parameters.get('ROTATION') is None ) is True and  Quaternion() or parameters.get('ROTATION')
     self.direction = Vector4()
     self.scale = Vector3(1,1,1)
     self.matrix = Matrix4()
     self.matrixLocal = Matrix4()
     self.matrixWorld = Matrix4()
     self.matrixRotationWorld = Matrix4()
     self.up = Vector3(0,1,0 )
     self.parameters =parameters
     self.rotationAngle= 10.
     self.currentMatrix = None
     self.initCurrentMatrix()


def initCurrentMatrix(self):
    glPushMatrix()
    glLoadIdentity()
    self.currentMatrix = glGetDoublev(GL_MODELVIEW_MATRIX)
    glPopMatrix()
    return 

def setID(self, Id ):
    self.ID = Id

def moveTo( self, x,y,z ):
    v=Vector4(x,y,z)
    #self.position.addSelf( self.rotation.rotateVector(v)  )
    self.position.addSelf( v )
    glPushMatrix()
    glLoadIdentity()
    glTranslatef( float(self.position.x),float(self.position.y),float(self.position.z) )
    self.currentMatrix =  glGetDoublev(GL_MODELVIEW_MATRIX)
    glPopMatrix()
    return self

def render(self):
    pass

このコードのチャンクでは、回転を実装する方法を確認できます。

def rotateX(self, angle=2 ):
    glPushMatrix()
    glRotated( angle, 0,1,0)
    glPopMatrix()
    return self

Vector4、Vector3、Quaternion、Matrix4 が自分のクラスの場合。

これは私の間違いですか?ローテーションのやり方は?

4

3 に答える 3

4

それが役立つかどうかはわかりませんが、オブジェクトを移動または回転するための一般的なワークフローは次のようになります。

  1. 静的なものを描く
  2. 実際の行列をスタックにプッシュ ( glPushMatrix)
  3. 単位行列の読み込み (初期行列) ( glLoadIdentity)
  4. 独自のマトリックスを使用してロードし、実際のマトリックスとして設定します
  5. glRotate / gl.... を介して実際の行列を変換します。
  6. 実際のマトリックスを独自のマトリックスとして保存します
  7. あなたのオブジェクトを描く
  8. スタックから行列をポップ ( glPopMatrix)
  9. 残りの静的なものを描画します

ステップ 5/6 で、変換マトリックスを更新しました。これはglRotate、回転行列を実際の変換行列に乗算するためのマクロのようなものであるため、必要です。常に単位行列をロードして実行するとglRotate、指定された度数だけ単位行列が変換されます->オブジェクトはこの度だけ回転して描画され、他のことは決して行われません-私は推測します、これはあなたのせいです.. .

上記の 9 つの手順を使用すると、オブジェクトの行列に回転行列が乗算され、その結果が次の反復ステップで次の乗算に使用されます。

これが一般的な理解に役立つことを願っています=)

于 2013-01-16T14:26:46.297 に答える
2

回転関数では、角度ではなく度でなければなりません:

glRotatef(度、0、0、-1)

それは動作しますか?

于 2012-12-12T22:08:38.607 に答える
0

これは私の間違いですか?

OpenGL を数学ライブラリと間違えていますが、そうではありません。いくつかの変数で保持している行列の計算に OpenGL を使用しないでください。実際には、OpenGL マトリックス関数はまったく使用しないでください。これらは固定関数パイプラインの一部であり、OpenGL の以降のバージョンから削除されました。

于 2012-11-04T01:24:11.387 に答える