Autor Wątek: Bullet + GLM brak obrotów  (Przeczytany 752 razy)

Offline Chester2000

  • Użytkownik

# Sierpień 08, 2010, 16:52:49
W końcu znalazłem chwile czasu abu zacząć pisać prosty framework 3d do testowania pomysłów go gier. Wiele osób zachwalało wiec wybór padł na GLM (matematyka) + SFML (okno, inputy, czas) + Bullet (fizyka) + OpenGL 3.2. Na początek prosta aplikacja -  sześcian + fizyka - obiekty się wyświetlają, fizyka działa. Problem jest w tym, że obiekt cały czas jest pionowo (powinien choćby delikatnie się obracać po upadku)). Albo źle pobieram dane z bulleta, albo źle wstawiam je do glm albo źle przekształcam.

Reczne obroty działają bez zarzutu i obiekt po wyrysowaniu jest obrócony zgodnie z danymi jaki mu ręcznie wpisuję.

kod pobierania danych z bulleta

           if(m_pDynamicWorld != NULL){
m_pDynamicWorld->stepSimulation(dtime);
}

btMotionState *ms = m_pBody->getMotionState();
if(ms == NULL) return;

btTransform world;
ms->getWorldTransform(world);

btVector3    p = world.getOrigin();

float fAngZ,fAngY, fAngX;
btMatrix3x3 rot;
rot.setIdentity();
rot = world.getBasis();
rot.getEulerZYX(fAngZ, fAngY, fAngX);
 
glm::mat4 trans1;
glm::mat4 trans = glm::translate(trans1,glm::vec3( p.getX(), p.getY(), p.getZ()));
glm::mat4 rotaX = glm::rotate(trans, fAngX,glm::vec3(1.0f,0.0f,0.0f));
glm::mat4 rotaY = glm::rotate(rotaX, fAngY,glm::vec3(0.0f,1.0f,0.0f));
glm::mat4 modelMatrix = glm::rotate(rotaY, fAngZ,glm::vec3(0.0f,0.0f,1.0f));

próbowałem też tak

  btScalar l[16];
           world.getOpenGLMatrix(l);
fAngZ = atan2f(l[1], l[5]);
fAngY = atan2f(l[8], l[10]);
fAngX = -asinf(l[9]);

i tak

btQuaternion q = world.getRotation();

glm::mat4 trans1;
glm::mat4 trans = glm::translate(trans1,glm::vec3( p.getX(), p.getY(), p.getZ()));
glm::mat4 rotaX = glm::rotate(trans, q.getX(),glm::vec3(1.0f,0.0f,0.0f));
glm::mat4 rotaY = glm::rotate(rotaX, q.getY(),glm::vec3(0.0f,1.0f,0.0f));
glm::mat4 modelMatrix = glm::rotate(rotaY, q.getZ(),glm::vec3(0.0f,0.0f,1.0f));


Bez zmian.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline skoti

  • Użytkownik

# Sierpień 08, 2010, 17:10:05
@Chester2000: Dlaczego na siłę chcesz używać GLM tam gdzie go nie potrzebujesz?
Kod: (cpp) [Zaznacz]
float mat[16];
RigidBody->getWorldTransform().getOpenGLMatrix(mat);
I "mat" możesz już wrzucać do shadera. Jeśli potrzebujesz tą macierz mnożyć przez inną macierz z glm co klatkę to lepiej rób to w shaderze.
Jeśli chcesz koniecznie na CPU to zamiast zmuszać CPU do liczenia wiele razy sin/cos po prostu przepisz gotowe dane:
Kod: (cpp) [Zaznacz]
macierz = glm::mat4x4( mat[0], mat[1], mat[2], mat[3],
mat[4], mat[5], mat[6], mat[7],
mat[8], mat[9], mat[10], mat[11],
mat[12], mat[13], mat[14], mat[15]);

Offline Chester2000

  • Użytkownik

# Sierpień 08, 2010, 17:39:00
No fakt trochę przekombinowałem ale SFML i GLM dopiero dzisiaj zacząłem używać - muszę się zapoznać głównie z GLM. Ale teraz działa dzięki.