2015-05-12 3 views
0

Я пытаюсь закодировать структуру матрицы на C++, и я новичок. Файл mat4.h:конструктор без параметров не работает, но один с работает

#include "math.h" 
namespace engine { 
    namespace math { 
     struct mat4 { 
      float elements[4 * 4]; // column major ordering, index = row + col * 4 

      mat4(); 
      mat4(float diagonal); 


      mat4& mul(const mat4& other); 
      static mat4 identity(); // construct and return an identity matrix 
      static mat4 orthographic(float left, float right, float bottom, float top, float near, float far); // boundaries (clipping planes) 
      static mat4 perspective(float fov, float aspectRatio, float near, float far); 
      static mat4 translation(const vec3& translation); 
      static mat4 rotation(float angle, const vec3 & axis); 
      static mat4 scale(const vec3 & scale); 
      friend mat4 operator*(mat4 left, const mat4 & right); 
      mat4& operator*=(const mat4 &other); 

     }; 
    } 
} 

А вот mat4.cpp:

#include "mat4.h" 
namespace engine { 
    namespace math { 

     mat4::mat4() { 
      for (int i = 0; i < 4 * 4; i++) 
       elements[i] = 0; 
     } 
     mat4::mat4(float diagonal) { 
      for (int i = 0; i < 4 * 4; ++i) { 
       elements[i] = 0; 
      } 
      for(int i = 0; i < 4; i += 1) 
       elements[i + i * 4] = diagonal; 
     } 
     mat4& mat4::mul(const mat4 &other) { 
      for (int i = 0; i < 4; ++i)  // col 
       for (int j = 0; j < 4; ++j) { // row 
        float sum = 0; 
        for (int k = 0; k < 4; ++k) 
         sum += elements[j + k * 4] * other.elements[k + i * 4]; 
        elements[j + i * 4] = sum; 
       } 
     } 

     mat4 mat4::identity() { 
      return mat4(1); 
     } 

     mat4 operator*(mat4 left, const mat4 &right) { 
      return left.mul(right); 
     } 

     mat4 &mat4::operator*=(const mat4 &other) { 
      return mul(other); 
     } 

     mat4 mat4::orthographic(float left, float right, float bottom, float top, float near, float far) { 
      mat4 result(1); 
      result.elements[0 + 0 * 4] = 2.0f/(right - left); 
      result.elements[1 + 1 * 4] = 2.0f/(top - bottom); 
      result.elements[2 + 2 * 4] = -2.0f/(far - near); 
      result.elements[0 + 3 * 4] = (left + right)/(left - right); 
      result.elements[1 + 3 * 4] = (bottom + top)/(bottom - top); 
      result.elements[2 + 3 * 4] = (far + near) /(far - near); 
      //result.elements[3 + 3 * 4] = 1; this is achieved by mat result(1); 
      return result; 
     } 

     mat4 mat4::perspective(float fov, float aspectRatio, float near, float far) { 
      mat4 result(); 

      float q = 1.0f/(float) tan(toRadians(fov)/2.0f); 
      result.elements[0 + 0 * 4] = q/aspectRatio; 
      result.elements[1 + 1 * 4] = q; 
      result.elements[2 + 2 * 4] = (-near - far)/(near - far); 
      result.elements[3 + 2 * 4] = 1; 
      result.elements[2 + 3 * 4] = 2 * far * near/(near - far); 
      return result; 
     } 
    } 
} 

Как вы можете видеть, у меня есть 2 конструкторы для mat4, тот, который получает поплавок по диагонали, и один без параметры. в орфографическом (...) результате может получить доступ к своим элементам правильно, но в перспективе (...) он не компилируется (когда я делаю mat4 result();), говоря «Требуется тип структуры вместо« mat4() ». Однако, если изменить линию mat4 result(); на:

mat4 result = mat4(); 

Тогда все в порядке. Что здесь происходит?

ответ

9

mat4 result(); заявляет о функции. Измените его на mat4 result;, чтобы объявить (и по умолчанию инициализировать) переменную.

+0

Так что, если мне нужен параметр, я использую 'mat4 result (5)', в противном случае 'mat4 result'? – shoham

+0

@shoham: Да, это так. –

+0

Я догадался о решении из названия. Это слишком распространенная ловушка с слишком большим количеством идентичных ответов. – nwp

Смежные вопросы