2014-10-22 5 views
0

을 렌더링하는 동안 :예기치 않은 비행 상자 사진에서 빠른 샘플 그래서

이 정상입니다 : rotated

이는 X 또는 Y 축 중 하나에 180도 회전 이후 normal

왜 이런 일이 발생하는지 전혀 알 수 없습니다. 간단한 Bullet 물리 장면을 렌더링하기 위해 OpenTK를 사용하고 있습니다. 코드는 직설적이며 매트릭스가 처리되는 방식에 문제가있는 것처럼 보입니다. 내가 그것을 분해 시도했습니다

 GL.PushMatrix(); 
     GL.MultMatrix(Body.MotionState.WorldTransform.ToArray()); 
     GL.Scale(HalfX * 2, HalfY * 2, HalfZ * 2); 
     GL.Color4(Color4.Blue); 
     GL.Begin(PrimitiveType.Lines); 
     GL.Vertex3(0, 0, 0); 
     GL.Vertex3(0, 0, 10); 
     GL.End(); 
     GL.Color4(Color4.Yellow); 
     GL.Begin(PrimitiveType.Lines); 
     GL.Vertex3(0, 0, 0); 
     GL.Vertex3(0, 10, 0); 
     GL.End(); 
     GL.Color4(Color4.Green); 
     GL.Begin(PrimitiveType.Lines); 
     GL.Vertex3(0, 0, 0); 
     GL.Vertex3(10, 0, 0); 
     GL.End(); 
     if (Body.ActivationState == ActivationState.ActiveTag) 
     { 
      GL.Color4(Color4.Blue); 
     } 
     else if (Mass == 0) 
     { 
      GL.Color4(Color4.Red); 
     } 
     else 
     { 
      GL.Color4(Color4.Green); 
     } 
     model.Draw(); 
     GL.PopMatrix(); 

구성 요소이다 : 그것은 렌더링 솔직 코드의 당신이 회전을 추가 할 때 변환 벡터 괜찮, 스케일링은 Z 축에 회전, 괜찮 잘 나타납니다 ... 그건 X 또는 Y 축에서 비행을 시작합니다. 나는 콘솔 아웃풋을 가지고있다. 박스는 두 이미지의 Z 축에 정확히 6.9999에있다.

어디로 잘못 가고 있습니까? 내가 뭘 놓치고 있니? 어떻게 해결할 수 있습니까?!

+0

WorldTransform을 계산하는 코드를 표시 할 수 있습니까? (버그와는 무관하지만'GL.Begin()','GL.End()'를 한 번만 호출하면됩니다.) –

+0

글 머리 기호 물리 엔진에서 계산할 수 없습니다. 나는 그것이 정확하다는 것을 추측 할 것이고, 그것은 중요한 엔진이다. 분해 된 매트릭스 코드를 보여 주면 도움이 될까요? (IE, 벡터의 각 구성 요소를 가져 와서 별도로 적용한 코드)? – mcmonkey4eva

+0

그래서 Bullet은 행렬을 계산하고 그것을 GL을 통해 OpenGL에 직접 전달합니다. GL.MultMatrix()가 맞습니까? 이 경우 OpenTK는 행렬을 수정하지 않고 드라이버에 직접 전달하기 만하므로 Bullet과 OpenGL 간의 불일치가 될 수 있습니다. 분해 된 행렬 조작을 표시하면 잘못된 점을 이해하는 데 도움이 될 수 있습니다. –

답변

1

오케이 ... PushAttrib(AttribMask.AllAttribBits); PushMatrix(); 내/TEXTFONT로드 코드/고정했습니다. 어떻게 든, 이상한 속성은 나중에 렌더링 할 글꼴을로드하는 코드에서 GL.Rotate가 (0, 0, 1) 대신 (0, 0, 1) 회전합니다 ... OpenGL은 확실히 변덕스러운 것입니다 ...

그래서 여기있는 교훈은 ... 결코 OpenGL을 다룰 때 무관 한 코드가 정말로 관련이 없다고 가정합니다.

+0

범인을 찾았는지 확인하십시오. 일반적으로 행렬 스택을 더 이상 사용하지 않는 현대 OpenGL에서는 상황이 훨씬 좋습니다. –