2015-12-03 2 views
1

Я нашел это copy on github для ссылки, но я использую тот, который загружен из sourceforge.vectormath библиотека и операции с матрицами

Мой вопрос о том, как они проектируют свои операции с матрицами, кажется мне очень странным.

Например, если я создаю матрицу 4 × 4 и задаю ее масштаб. Затем я хотел бы повернуть эту предыдущую матрицу, используя библиотеку матриц vectormath, похоже, возвращает матрицу обратно в единую матрицу, а затем применяет поворот, который не имеет никакого смысла, почему это произойдет.

Посмотрите на эту функцию, чтобы сделать поворот

static inline void vmathM4MakeRotationY(VmathMatrix4 *result, float radians) 
{ 
    float s, c; 
    s = sinf(radians); 
    c = cosf(radians); 
    vmathV4MakeFromElems(&result->col0, c, 0.0f, -s, 0.0f); 
    vmathV4MakeYAxis(&result->col1); 
    vmathV4MakeFromElems(&result->col2, s, 0.0f, c, 0.0f); 
    vmathV4MakeWAxis(&result->col3); 
} 

ли эта библиотека ожидать вас держать несколько матриц вокруг использования одного применять ротацию затем умножить?

редактировать

это какой-то предыдущая матрица математике код, который я использовал, чтобы повернуть матрицу, это выглядит следующим образом.

mat4_s mat4_rotateX(mat4_s* out, float angle, mat4_s* inMat) 
{ 
    float s = sinf(angle), 
      c = cosf(angle), 
      a10 = inMat->m[4], 
      a11 = inMat->m[5], 
      a12 = inMat->m[6], 
      a13 = inMat->m[7], 
      a20 = inMat->m[8], 
      a21 = inMat->m[9], 
      a22 = inMat->m[10], 
      a23 = inMat->m[11]; 

    if (!out->m) { 
     for(size_t i = 0; i < 16; i++) 
     { 
      out->m[i] = inMat->m[i]; 
     } 
    } else if (inMat->m != out->m) { // If the source and destination differ, copy the unchanged rows 
     out->m[0] = inMat->m[0]; 
     out->m[1] = inMat->m[1]; 
     out->m[2] = inMat->m[2]; 
     out->m[3] = inMat->m[3]; 

     out->m[12] = inMat->m[12]; 
     out->m[13] = inMat->m[13]; 
     out->m[14] = inMat->m[14]; 
     out->m[15] = inMat->m[15]; 
    } 


    out->m[4] = a10 * c + a20 * s; 
    out->m[5] = a11 * c + a21 * s; 
    out->m[6] = a12 * c + a22 * s; 
    out->m[7] = a13 * c + a23 * s; 

    out->m[8] = a10 * -s + a20 * c; 
    out->m[9] = a11 * -s + a21 * c; 
    out->m[10] = a12 * -s + a22 * c; 
    out->m[11] = a13 * -s + a23 * c; 
    return *out; 
} 

Это процесс, который я должен предпринять, чтобы заставить vectormath делать то же самое.

mat4* mat4_rotate_y(mat4* out, const float angle){ 
    mat4 m; 
    mat4_identity_v(&m); 
    vmathM4MakeRotationY(m, angle); 
    mat4_multi(out, out, m); 
    return out; 
} 

код умножения является довольно стандартным, но vmathM4MakeRotationY выглядит следующим образом:

static inline void vmathM4MakeRotationZ(VmathMatrix4 *result, float radians) 
{ 
    float s, c; 
    s = sinf(radians); 
    c = cosf(radians); 
    vmathV4MakeFromElems(&result->col0, c, s, 0.0f, 0.0f); 
    vmathV4MakeFromElems(&result->col1, -s, c, 0.0f, 0.0f); 
    vmathV4MakeZAxis(&result->col2); 
    vmathV4MakeWAxis(&result->col3); 
} 

только для завершенности vmathV4Make_Axis выглядит следующим образом:

static inline void vmathV4MakeZAxis(VmathVector4 *result) { 
    vmathV4MakeFromElems(result, 0.0f, 0.0f, 1.0f, 0.0f); 
} 

vmathV4MakeFromElms выглядит следующим образом:

static inline void vmathV4MakeFromElems(VmathVector4 *result, float _x, 
             float _y, float _z, float _w) { 
    result->x = _x; 
    result->y = _y; 
    result->z = _z; 
    result->w = _w; 
} 
+0

Что говорит документация? –

ответ

1

Эта функция, похоже, делает «Инициализировать матрицу как преобразование вращения» вместо того, что вы ожидаете, «Добавить преобразование вращения в текущее преобразование».

Как вы говорите, вы можете работать вокруг, сохраняя вращение в отдельную временную матрицу и умножения:

VmathMatrix4 temp; 
vmathM4MakeRotationY(&temp, 1.23); 
vmathM4Mul(&mytransform, &mytransform, &temp); 

Это довольно много, что гипотетический vmathM4ApplyRotationY() придется делать в любом случае.

+0

Это то, что я должен был сделать, чтобы заставить его работать, что кажется мне немного неудобным. Я написал свой собственный код умножения матрицы, прежде чем, возможно, это просто происходит по-другому. Не возражаете взглянуть на редактирование, которое я сделаю на исходный вопрос. Разве библиотека vectormath просто делает то, что я сделал по-другому? – user1610950

+0

@ user1610950 Другой код, который вы показываете, выглядит так, как будто у него есть рукописное матричное умножение. Это позволяет избежать умножения элементов, которые, как известно, равны нулю, но, с другой стороны, ему также не хватает возможности использовать SIMD для этого. – jpa

+0

спасибо, что немного разъясняет. Кажется, что много данных перемещается уже, но эй, поэтому я перехожу из этого старого кода в vectormath. – user1610950