2014-10-22 3 views
0

Таким образом, для быстрой выборки в картинках:Неожиданные летающие ящики, пытаясь оказать

Это нормально: normal

это после поворота на 180 градусов по обе оси Х или Y оси: rotated

Я не понимаю, почему это происходит вообще. Я использую OpenTK для создания простой сцены физики Bullet. Код прямолинейный, и похоже, что что-то не так в том, как обрабатывается матрица. Это прямо вперед вынести код:

 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, с которой он начинает летать. У меня есть выход на консоль: ящик равен ровно 6,9999 по оси Z в обоих изображениях.

Куда я иду не так? Что мне не хватает? Как это исправить?!

+0

Можете ли вы показать код, который вычисляет WorldTransform? (Не связано с ошибкой, но вам нужно только один раз вызвать 'GL.Begin()', 'GL.End()'.) –

+0

Я не могу, это рассчитано Bullet Physics Engine. Я бы рискнул предположить, что это точно, будучи основным двигателем. Помогло бы мне, если бы я показал код разложенной матрицы? (IE, код, где я взял каждую компоненту вектора и применил его отдельно)? – mcmonkey4eva

+0

Итак, Bullet вычисляет матрицу, и вы передаете это прямо в OpenGL через 'GL.MultMatrix()', это правильно? В этом случае OpenTK не изменяет вашу матрицу, она просто передает ее непосредственно драйверу, поэтому проблема может быть несоответствием между Bullet и OpenGL. Отображение разложенной матрицы ops может помочь понять, что происходит неправильно. –

ответ

1

Хорошо, так ... PushAttrib(AttribMask.AllAttribBits); PushMatrix(); в моем/TEXTFONT LOADING CODE/исправлено. Так или иначе, некоторый странный атрибут, установленный в коде, который загружает шрифты для последующего рендеринга, делает GL.Rotate вращаться вокруг (0, 0, 1) вместо (0, 0, 0) ... OpenGL уверен, является темпераментным ...

Итак, урок здесь ... never предположить, что несвязанный код действительно не имеет отношения к OpenGL.

+0

Рад что вы нашли преступника. В общем, в современном OpenGL все намного лучше, чем в стеке матриц. –