Matrix operator*(const Matrix &m) const { Matrix t; for (int i = 0; i < 16; ++i) } const int j(i & 3), k(i & ~3); t.matrix[i] = matrix[0 + j] * matrix[k + 0] + matrix[4 + j] * matrix[k + 1] + matrix[8 + j] * matrix[k + 2] + matrix[12+j] * matrix[k + 3]; } return t; }
const int j(i & 3), k(i & ~3);
の部分の & は何をしてますか?
---追記---
GLFW による OpenGL 入門(130p)
http://marina.sys.wakayama-u.ac.jp/~tokoi/GLFWdraft.pdf
をやってます。実行できます
#pragma once #include <algorithm> #include <GL/glew.h> #include <cmath> class Matrix { GLfloat matrix[16]; public: Matrix() {} Matrix(const GLfloat *a) { std::copy(a, a + 16, matrix); } const GLfloat *data() const { return matrix; } void loadIdentity() { std::fill(matrix, matrix + 16, 0.0f); matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.0f; } static Matrix identity() { Matrix t; t.loadIdentity(); return t; } static Matrix translate(GLfloat x, GLfloat y, GLfloat z) { Matrix t; t.loadIdentity(); t.matrix[12] = x; t.matrix[13] = y; t.matrix[14] = z; return t; } static Matrix scale(GLfloat x, GLfloat y, GLfloat z) { Matrix t; t.loadIdentity(); t.matrix[0] = x; t.matrix[5] = y; t.matrix[10] = z; return t; } static Matrix shearXY(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[4] = angle; return t; } static Matrix shearYZ(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[9] = angle; return t; } static Matrix shearZX(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[2] = angle; return t; } static Matrix shearYX(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[1] = angle; return t; } static Matrix shearZY(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[6] = angle; return t; } static Matrix shearXZ(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[8] = angle; return t; } static Matrix rotationX(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[5] = cos(angle); t.matrix[6] = sin(angle); t.matrix[9] = -sin(angle); t.matrix[10] = cos(angle); return t; } static Matrix rotationY(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[0] = cos(angle); t.matrix[2] = sin(angle); t.matrix[8] = -sin(angle); t.matrix[10] = cos(angle); return t; } static Matrix rotationZ(GLfloat angle) { Matrix t; t.loadIdentity(); t.matrix[0] = cos(angle); t.matrix[1] = sin(angle); t.matrix[4] = -sin(angle); t.matrix[5] = cos(angle); return t; } static Matrix rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z) { Matrix t; const GLfloat d(sqrt(x * x + y * y + z * z)); if (d > 0.0f) { const GLfloat l(x / d), m(y / d), n(z / d); const GLfloat l2(l * l), m2(m * m), n2(n * n); const GLfloat lm(l * m), mn(m * n), nl(n * l); const GLfloat c(cos(a)), c1(1.0f - c), s(sin(a)); t.loadIdentity(); t.matrix[0] = (1.0f - l2) * c + l2; t.matrix[1] = lm * c1 + n * s; t.matrix[2] = nl * c1 - m * s; t.matrix[4] = lm * c1 - n * s; t.matrix[5] = (1.0f - m2) * c + m2; t.matrix[6] = mn * c1 + l * s; t.matrix[8] = nl * c1 + m * s; t.matrix[9] = mn * c1 - l * s; t.matrix[10] = (1.0f - n2) * c + n2; } return t; } Matrix operator*(const Matrix &m) const { Matrix t; for (int i = 0; i < 16; ++i) { const int j(i & 3), k(i & ~3); t.matrix[i] = matrix[0 + j] * matrix[k + 0] + matrix[4 + j] * matrix[k + 1] + matrix[8 + j] * matrix[k + 2] + matrix[12+j] * matrix[k + 3]; } return t; } };
回答1件
あなたの回答
tips
プレビュー