Как обновить матрицу преобразования (NewtonGameDyanmics / OpenGL)? - PullRequest
0 голосов
/ 24 марта 2012

Я пытаюсь смоделировать вращающуюся коробку, используя Newton Physics и OpenGL.Это то, что я реализовал.

float mat44[16] = {
    1,0,0,0,
    0,1,0,0,
    0,0,1,0,
    0,0,0,1
};

box.mat = &mat44[0];
box.x_size = 0.50;
box.y_size = 0.50;
box.z_size = 0.50;

nWorld = NewtonCreate(NULL, NULL);

NewtonCollision * collision = NULL;
collision = NewtonCreateBox(nWorld, box.x_size, box.y_size, box.z_size,NULL);
body = NewtonCreateBody(nWorld, collision);
NewtonReleaseCollision (nWorld, collision);
NewtonBodySetMassMatrix(body, 10.0, 2.0, 2.0, 2.0);
NewtonBodySetMatrix (body, box.mat);
float omega[3] = {0.0f, 10.0f, 0.0f};
NewtonBodySetOmega (body, &omega[0]);

внутри цикла рендеринга. Я делаю эти вещи.

NewtonUpdate(nWorld, time);
float m[16];
NewtonBodyGetMatrix(body, &m[0]);
box.mat = m;

Моя проблема в том, как нарисовать куб (на самом деле 8 точек), используяматрица (box.mat)?Как я могу рассчитать обновленные точки вершин, используя матрицу?

1 Ответ

0 голосов
/ 24 марта 2012

Вы рассматриваете вершину как вектор-столбец и умножаете на нее свою матрицу.

r.x = v.x * m[0] + v.y * m[1] + v.z * m[2]  + m[3]
r.y = v.x * m[4] + v.y * m[5] + v.z * m[6]  + m[7]
r.z = v.x * m[8] + v.y * m[9] + v.z * m[10] + m[11]

Где [v.x, v.y, v.z, 1] - позиция вершины, а r - выходная вершина.

Между прочим, если вы используете OpenGL, «правильная» вещь, которую нужно сделать, это передать OpenGL неизмененные вершины и просто использовать box.mat как «матрицу модели» для OpenGL (часть матрицы вида модели).

...