2012-11-04 4 views
0

하나의 개체를 X 축에서 회전하려고하는데 이해가 안됩니다. 당신이 회전을 구현하는 방법을 참조 코드의 덩어리에서PyOpenGL에서 object3D를 회전하는 방법은 무엇입니까?

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 

:

나는 그것의 클래스 개체 3D가

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

Vector4가, Vector3, 사원 수, Matrix4 내 자신이다 수업.

이게 내 실수 야? 그리고 어떻게 회전 시키는가?

답변

0

이게 내 실수 야?

OpenGL을 수학 라이브러리로 착각했습니다. 그렇지 않은 경우가 있습니다. OpenGL을 사용하여 일부 변수에서 유지하는 행렬에 수학을 수행하지 마십시오. 사실, OpenGL 행렬 함수를 전혀 사용하지 마십시오. 그것들은 고정 기능 파이프 라인의 일부이며 이후 버전의 OpenGL에서 제거되었습니다.

glRotatef (도, 0, 0, -1)

그 일을합니까 : 당신의 회전의 FUNC에서

+0

그럼 PyOpenGL없이 회전하는 방법은 무엇입니까? –

+0

3D 그래픽 변환에서 4x4 행렬로 표시됩니다. 회전은 그러한 행렬로 표현 될 수 있습니다. 각 객체에는 세계에서의 위치를 ​​설명하는 변형 행렬이 있습니다. 해당 행렬에 대한 변경 사항은 해당 변경 사항을 설명하는 행렬을 곱하여 나타납니다. 오브젝트를 그릴 때 먼저 컴포지션의 뷰 변형 (카메라 정렬) 및 오브젝트의 변환 행렬을 계산하여이를 정점 셰이더의 유니폼으로 전달합니다. 투영 행렬 (카메라 렌즈의 일종)과 함께 이것은 전체 변형을 정의합니다 – datenwolf

2

, 그것은도하지 각도해야 하는가?

3

나는 그것이 도움이 있는지, 모르겠지만, 이동 또는 객체를 회전하는 일반적인 워크 플로는 다음과 같다 :

  1. 것은 그리 정적 물건 스택 (glPushMatrix)
  2. 푸시 실제 매트릭스
  3. 부하 행렬 (초기 매트릭스) (glLoadIdentity)
  4. 은 glRotate를 통해 실제 행렬을 변환 자신의 매트릭스와 부하를 사용하고 실제 매트릭스
  5. 로 설정/GL ....
  6. 는 개체 그리는 자신의 매트릭스
  7. 로 단계 스택 (glPopMatrix) 정적 물건의
  8. 그리기 나머지

에서

  • 팝 행렬을 실제 매트릭스를 저장 5/6 변환 매트릭스를 업데이트했습니다. glRotate은 실제 변환 행렬에 회전 행렬을 곱하는 것과 같습니다. 항등 행렬을 항상로드 한 다음 glRotate을 수행하면 주어진 차수만큼 항등 행렬이 변환됩니다. ->이 정도만큼 객체가 회전되고 그 다음 다른 작업을 수행하지 않습니다. - 네 잘못이라고 생각합니다. ..

    위의 9 단계를 사용하면 개체의 행렬에 회전 행렬이 곱해지고 그 결과가 다음 반복 단계에서 다음 번 곱하기에 사용됩니다.

    이 질문이 일반적인 이해에 도움이 될 것입니다. =)