Working on adding Eigen

This commit is contained in:
Vladislav Khorev committed 2026-01-03 19:52:44 +03:00
1 parent c553780b6e
commit 9bfe2bef89
16 files changed
+402 -503

No files matched your search

+1 -1
View File
@@ -62,7 +62,7 @@ namespace ZL {
float frequency = 7.0f;
// Ïîëó÷àåì çíà÷åíèå øóìà (îáû÷íî îò -1 äî 1)
float noiseValue = noise(pos.v[0] * frequency, pos.v[1] * frequency, pos.v[2] * frequency);
float noiseValue = noise(pos(0) * frequency, pos(1) * frequency, pos(2) * frequency);
// Ìàñøòàáèðóåì: õîòèì îòêëîíåíèå îò 1.0 äî 1.1 (ïðèìåðíî)
float height = 1.0f + (noiseValue * noiseCoeff);
+124 -241
View File
@@ -5,6 +5,7 @@
namespace ZL {
/*
Vector2f operator+(const Vector2f& x, const Vector2f& y)
{
Vector2f result;
@@ -24,7 +25,8 @@ namespace ZL {
return result;
}
*/
/*
Vector3f operator+(const Vector3f& x, const Vector3f& y)
{
Vector3f result;
@@ -54,7 +56,8 @@ namespace ZL {
result.v[2] = -x.v[2];
return result;
}
*/
/*
Vector4f operator+(const Vector4f& x, const Vector4f& y)
{
Vector4f result;
@@ -78,7 +81,7 @@ namespace ZL {
}
Matrix3f Matrix3f::Identity()
{
Matrix3f r;
@@ -97,8 +100,8 @@ namespace ZL {
return r;
}
}*/
/*
Matrix4f Matrix4f::Identity()
{
Matrix4f r;
@@ -125,8 +128,8 @@ namespace ZL {
return r;
}
}*/
/*
Matrix4f operator*(const Matrix4f& m1, const Matrix4f& m2)
{
Matrix4f r;
@@ -153,7 +156,7 @@ namespace ZL {
r.m[15] = m1.m[3] * m2.m[12] + m1.m[7] * m2.m[13] + m1.m[11] * m2.m[14] + m1.m[15] * m2.m[15];
return r;
}
}*/
Matrix4f MakeOrthoMatrix(float width, float height, float zNear, float zFar)
{
@@ -166,25 +169,25 @@ namespace ZL {
Matrix4f r;
r.m[0] = 2.f / width;
r.m[1] = 0;
r.m[2] = 0;
r.m[3] = 0;
r.data()[0] = 2.f / width;
r.data()[1] = 0;
r.data()[2] = 0;
r.data()[3] = 0;
r.m[4] = 0;
r.m[5] = 2.f / height;
r.m[6] = 0;
r.m[7] = 0;
r.data()[4] = 0;
r.data()[5] = 2.f / height;
r.data()[6] = 0;
r.data()[7] = 0;
r.m[8] = 0;
r.m[9] = 0;
r.m[10] = -1 / depthRange;
r.m[11] = 0;
r.data()[8] = 0;
r.data()[9] = 0;
r.data()[10] = -1 / depthRange;
r.data()[11] = 0;
r.m[12] = -1;
r.m[13] = -1;
r.m[14] = zNear / depthRange;
r.m[15] = 1;
r.data()[12] = -1;
r.data()[13] = -1;
r.data()[14] = zNear / depthRange;
r.data()[15] = 1;
return r;
}
@@ -203,20 +206,20 @@ namespace ZL {
Matrix4f r;
// Масштабирование
r.m[0] = 2.f / width;
r.m[5] = 2.f / height;
r.m[10] = -1.f / depthRange;
r.data()[0] = 2.f / width;
r.data()[5] = 2.f / height;
r.data()[10] = -1.f / depthRange;
// Обнуление неиспользуемых компонентов
r.m[1] = r.m[2] = r.m[3] = 0;
r.m[4] = r.m[6] = r.m[7] = 0;
r.m[8] = r.m[9] = r.m[11] = 0;
r.data()[1] = r.data()[2] = r.data()[3] = 0;
r.data()[4] = r.data()[6] = r.data()[7] = 0;
r.data()[8] = r.data()[9] = r.data()[11] = 0;
// Трансляция (смещение)
r.m[12] = -(xmax + xmin) / width;
r.m[13] = -(ymax + ymin) / height;
r.m[14] = zNear / depthRange;
r.m[15] = 1.f;
r.data()[12] = -(xmax + xmin) / width;
r.data()[13] = -(ymax + ymin) / height;
r.data()[14] = zNear / depthRange;
r.data()[15] = 1.f;
return r;
}
@@ -231,158 +234,60 @@ namespace ZL {
throw std::runtime_error("Invalid perspective parameters");
}
r.m[0] = 1.f / (aspectRatio * tanHalfFovy);
r.m[1] = 0;
r.m[2] = 0;
r.m[3] = 0;
r.data()[0] = 1.f / (aspectRatio * tanHalfFovy);
r.data()[1] = 0;
r.data()[2] = 0;
r.data()[3] = 0;
r.m[4] = 0;
r.m[5] = 1.f / (tanHalfFovy);
r.m[6] = 0;
r.m[7] = 0;
r.data()[4] = 0;
r.data()[5] = 1.f / (tanHalfFovy);
r.data()[6] = 0;
r.data()[7] = 0;
r.m[8] = 0;
r.m[9] = 0;
r.m[10] = -(zFar + zNear) / (zFar - zNear);
r.m[11] = -1;
r.data()[8] = 0;
r.data()[9] = 0;
r.data()[10] = -(zFar + zNear) / (zFar - zNear);
r.data()[11] = -1;
r.m[12] = 0;
r.m[13] = 0;
r.m[14] = -(2.f * zFar * zNear) / (zFar - zNear);
r.m[15] = 0;
r.data()[12] = 0;
r.data()[13] = 0;
r.data()[14] = -(2.f * zFar * zNear) / (zFar - zNear);
r.data()[15] = 0;
return r;
}
Matrix3f QuatToMatrix(const Vector4f& q)
Matrix3f QuatToMatrix(const Eigen::Quaternionf& q)
{
Matrix3f m;
float wx, wy, wz, xx, yy, yz, xy, xz, zz, s, x2, y2, z2;
s = 2.0f / (q.v[0] * q.v[0] + q.v[1] * q.v[1] + q.v[2] * q.v[2] + q.v[3] * q.v[3]);
x2 = q.v[0] * s;
y2 = q.v[1] * s;
z2 = q.v[2] * s;
wx = q.v[3] * x2; wy = q.v[3] * y2; wz = q.v[3] * z2;
xx = q.v[0] * x2; xy = q.v[1] * x2; xz = q.v[2] * x2;
yy = q.v[1] * y2; yz = q.v[2] * y2;
zz = q.v[2] * z2;
m.m[0] = 1.0f - (yy + zz);
m.m[1] = xy + wz;
m.m[2] = xz - wy;
m.m[3] = xy - wz;
m.m[4] = 1.0f - (xx + zz);
m.m[5] = yz + wx;
m.m[6] = xz + wy;
m.m[7] = yz - wx;
m.m[8] = 1.0f - (xx + yy);
return m;
return q.toRotationMatrix();
}
Vector4f MatrixToQuat(const Matrix3f& m)
Eigen::Quaternionf MatrixToQuat(const Matrix3f& m)
{
Vector4f r;
float trace = m.m[0] + m.m[4] + m.m[8];
if (trace > 0)
{
float s = 0.5f / sqrtf(trace + 1.0f);
r.v[3] = 0.25f / s;
r.v[0] = (m.m[5] - m.m[7]) * s;
r.v[1] = (m.m[6] - m.m[2]) * s;
r.v[2] = (m.m[1] - m.m[3]) * s;
}
else if (m.m[0] > m.m[4] && m.m[0] > m.m[8])
{
float s = 2.0f * sqrtf(1.0f + m.m[0] - m.m[4] - m.m[8]);
r.v[3] = (m.m[5] - m.m[7]) / s;
r.v[0] = 0.25f * s;
r.v[1] = (m.m[1] + m.m[3]) / s;
r.v[2] = (m.m[6] + m.m[2]) / s;
}
else if (m.m[4] > m.m[8])
{
float s = 2.0f * sqrtf(1.0f + m.m[4] - m.m[0] - m.m[8]);
r.v[3] = (m.m[6] - m.m[2]) / s;
r.v[0] = (m.m[1] + m.m[3]) / s;
r.v[1] = 0.25f * s;
r.v[2] = (m.m[5] + m.m[7]) / s;
}
else
{
float s = 2.0f * sqrtf(1.0f + m.m[8] - m.m[0] - m.m[4]);
r.v[3] = (m.m[1] - m.m[3]) / s;
r.v[0] = (m.m[6] + m.m[2]) / s;
r.v[1] = (m.m[5] + m.m[7]) / s;
r.v[2] = 0.25f * s;
}
return r.normalized();
return Eigen::Quaternionf(m).normalized();
}
Vector4f QuatFromRotateAroundX(float angle)
{
Vector4f result;
result.v[0] = sinf(angle * 0.5f);
result.v[1] = 0.f;
result.v[2] = 0.f;
result.v[3] = cosf(angle * 0.5f);
return result;
Eigen::Quaternionf QuatFromRotateAroundX(float angle) {
return Eigen::Quaternionf(Eigen::AngleAxisf(angle, Eigen::Vector3f::UnitX()));
}
Vector4f QuatFromRotateAroundY(float angle)
{
Vector4f result;
result.v[0] = 0.f;
result.v[1] = sinf(angle * 0.5f);
result.v[2] = 0.f;
result.v[3] = cosf(angle * 0.5f);
return result;
Eigen::Quaternionf QuatFromRotateAroundY(float angle) {
return Eigen::Quaternionf(Eigen::AngleAxisf(angle, Eigen::Vector3f::UnitY()));
}
Vector4f QuatFromRotateAroundZ(float angle)
{
Vector4f result;
result.v[0] = 0.f;
result.v[1] = 0.f;
result.v[2] = sinf(angle * 0.5f);
result.v[3] = cosf(angle * 0.5f);
return result;
Eigen::Quaternionf QuatFromRotateAroundZ(float angle) {
return Eigen::Quaternionf(Eigen::AngleAxisf(angle, Eigen::Vector3f::UnitZ()));
}
Matrix3f TransposeMatrix(const Matrix3f& m)
{
Matrix3f r;
r.m[0] = m.m[0];
r.m[1] = m.m[3];
r.m[2] = m.m[6];
r.m[3] = m.m[1];
r.m[4] = m.m[4];
r.m[5] = m.m[7];
r.m[6] = m.m[2];
r.m[7] = m.m[5];
r.m[8] = m.m[8];
return r;
return m.transpose();
}
Matrix3f InverseMatrix(const Matrix3f& m)
{
float d;
/*float d;
Matrix3f r;
d = m.m[0] * (m.m[4] * m.m[8] - m.m[5] * m.m[7]);
@@ -410,12 +315,14 @@ namespace ZL {
r.m[8] = (m.m[0] * m.m[4] - m.m[1] * m.m[3]) / d;
};
return r;
return r;*/
return m.inverse();
}
Matrix4f InverseMatrix(const Matrix4f& mat)
{
/*
Matrix4f inv;
float det;
@@ -531,7 +438,6 @@ namespace ZL {
mat.m[8] * mat.m[1] * mat.m[6] -
mat.m[8] * mat.m[2] * mat.m[5];
// ��������� �����������
det = mat.m[0] * inv.m[0] + mat.m[1] * inv.m[4] + mat.m[2] * inv.m[8] + mat.m[3] * inv.m[12];
if (std::fabs(det) < 0.01f)
@@ -539,30 +445,28 @@ namespace ZL {
throw std::runtime_error("Error: matrix cannot be inversed!");
}
// ����� ��� �������� �� �����������
det = 1.0f / det;
for (int i = 0; i < 16; i++)
{
inv.m[i] *= det;
}
return inv;
return inv;*/
return mat.inverse();
}
Matrix3f CreateZRotationMatrix(float angle)
{
Matrix3f result = Matrix3f::Identity();
Eigen::Matrix3f m = Eigen::AngleAxisf(angle, Eigen::Vector3f::UnitZ()).toRotationMatrix();
result.m[0] = cosf(angle);
result.m[1] = -sinf(angle);
result.m[3] = sinf(angle);
result.m[4] = cosf(angle);
return result;
return m;
}
Matrix4f MultMatrixMatrix(const Matrix4f& m1, const Matrix4f& m2)
{
return m1 * m2;
/*
Matrix4f rx;
rx.m[0] = m1.m[0] * m2.m[0] + m1.m[4] * m2.m[1] + m1.m[8] * m2.m[2] + m1.m[12] * m2.m[3];
@@ -586,35 +490,22 @@ namespace ZL {
rx.m[14] = m1.m[2] * m2.m[12] + m1.m[6] * m2.m[13] + m1.m[10] * m2.m[14] + m1.m[14] * m2.m[15];
rx.m[15] = m1.m[3] * m2.m[12] + m1.m[7] * m2.m[13] + m1.m[11] * m2.m[14] + m1.m[15] * m2.m[15];
return rx;
return rx;*/
}
Matrix3f MultMatrixMatrix(const Matrix3f& m1, const Matrix3f& m2)
{
Matrix3f r;
r.m[0] = m1.m[0] * m2.m[0] + m1.m[3] * m2.m[1] + m1.m[6] * m2.m[2];
r.m[1] = m1.m[1] * m2.m[0] + m1.m[4] * m2.m[1] + m1.m[7] * m2.m[2];
r.m[2] = m1.m[2] * m2.m[0] + m1.m[5] * m2.m[1] + m1.m[8] * m2.m[2];
r.m[3] = m1.m[0] * m2.m[3] + m1.m[3] * m2.m[4] + m1.m[6] * m2.m[5];
r.m[4] = m1.m[1] * m2.m[3] + m1.m[4] * m2.m[4] + m1.m[7] * m2.m[5];
r.m[5] = m1.m[2] * m2.m[3] + m1.m[5] * m2.m[4] + m1.m[8] * m2.m[5];
r.m[6] = m1.m[0] * m2.m[6] + m1.m[3] * m2.m[7] + m1.m[6] * m2.m[8] ;
r.m[7] = m1.m[1] * m2.m[6] + m1.m[4] * m2.m[7] + m1.m[7] * m2.m[8];
r.m[8] = m1.m[2] * m2.m[6] + m1.m[5] * m2.m[7] + m1.m[8] * m2.m[8];
return r;
return m1 * m2;
}
Matrix3f MakeTranslationMatrix(const Vector3f& p)
/*
Matrix4f MakeTranslationMatrix(const Vector3f& p)
{
Matrix3f r = Matrix3f::Identity();
Matrix4f r = Matrix4f::Identity();
r.m[12] = p.v[0];
r.m[13] = p.v[1];
r.m[14] = p.v[2];
r.m[12] = p(0);
r.m[13] = p(1);
r.m[14] = p(2);
return r;
}
@@ -639,8 +530,8 @@ namespace ZL {
r.m[14] = p.v[2];
return r;
}
}*/
/*
Vector2f operator*(Vector2f v, float scale)
{
Vector2f r = v;
@@ -649,8 +540,8 @@ namespace ZL {
r.v[1] = v.v[1] * scale;
return r;
}
}*/
/*
Vector3f operator*(Vector3f v, float scale)
{
Vector3f r = v;
@@ -661,7 +552,8 @@ namespace ZL {
return r;
}
*/
/*
Vector4f operator*(Vector4f v, float scale)
{
Vector4f r = v;
@@ -673,53 +565,58 @@ namespace ZL {
return r;
}
*/
Vector3f MultVectorMatrix(Vector3f v, Matrix3f mt)
{
return v.transpose() * mt;
/*
Vector3f r;
r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[1] + v.v[2] * mt.m[2];
r.v[1] = v.v[0] * mt.m[3] + v.v[1] * mt.m[4] + v.v[2] * mt.m[5];
r.v[2] = v.v[0] * mt.m[6] + v.v[1] * mt.m[7] + v.v[2] * mt.m[8];
r(0) = v(0) * mt.m[0] + v(1) * mt.m[1] + v(2) * mt.m[2];
r(1) = v(0) * mt.m[3] + v(1) * mt.m[4] + v(2) * mt.m[5];
r(2) = v(0) * mt.m[6] + v(1) * mt.m[7] + v(2) * mt.m[8];
return r;
return r;*/
}
Vector4f MultVectorMatrix(Vector4f v, Matrix4f mt)
{
Vector4f r;
/*Vector4f r;
r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[1] + v.v[2] * mt.m[2] + v.v[3] * mt.m[3];
r.v[1] = v.v[0] * mt.m[4] + v.v[1] * mt.m[5] + v.v[2] * mt.m[6] + v.v[3] * mt.m[7];
r.v[2] = v.v[0] * mt.m[8] + v.v[1] * mt.m[9] + v.v[2] * mt.m[10] + v.v[3] * mt.m[11];
r.v[3] = v.v[0] * mt.m[12] + v.v[1] * mt.m[13] + v.v[2] * mt.m[14] + v.v[3] * mt.m[15];
r(0) = v(0) * mt.m[0] + v(1) * mt.m[1] + v(2) * mt.m[2] + v(3) * mt.m[3];
r(1) = v(0) * mt.m[4] + v(1) * mt.m[5] + v(2) * mt.m[6] + v(3) * mt.m[7];
r(2) = v(0) * mt.m[8] + v(1) * mt.m[9] + v(2) * mt.m[10] + v(3) * mt.m[11];
r(3) = v(0) * mt.m[12] + v(1) * mt.m[13] + v(2) * mt.m[14] + v(3) * mt.m[15];
return r;
return r;*/
return v.transpose() * mt;
}
Vector4f MultMatrixVector(Matrix4f mt, Vector4f v)
{
Vector4f r;
return mt * v;
/*Vector4f r;
r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[4] + v.v[2] * mt.m[8] + v.v[3] * mt.m[12];
r.v[1] = v.v[0] * mt.m[1] + v.v[1] * mt.m[5] + v.v[2] * mt.m[9] + v.v[3] * mt.m[13];
r.v[2] = v.v[0] * mt.m[2] + v.v[1] * mt.m[6] + v.v[2] * mt.m[10] + v.v[3] * mt.m[14];
r.v[3] = v.v[0] * mt.m[3] + v.v[1] * mt.m[7] + v.v[2] * mt.m[11] + v.v[3] * mt.m[15];
r(0) = v(0) * mt.m[0] + v(1) * mt.m[4] + v(2) * mt.m[8] + v(3) * mt.m[12];
r(1) = v(0) * mt.m[1] + v(1) * mt.m[5] + v(2) * mt.m[9] + v(3) * mt.m[13];
r(2) = v(0) * mt.m[2] + v(1) * mt.m[6] + v(2) * mt.m[10] + v(3) * mt.m[14];
r(3) = v(0) * mt.m[3] + v(1) * mt.m[7] + v(2) * mt.m[11] + v(3) * mt.m[15];
return r;
return r;*/
}
Vector3f MultMatrixVector(Matrix3f mt, Vector3f v)
{
Vector3f r;
return mt * v;
/*Vector3f r;
r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[3] + v.v[2] * mt.m[6];
r.v[1] = v.v[0] * mt.m[1] + v.v[1] * mt.m[4] + v.v[2] * mt.m[7];
r.v[2] = v.v[0] * mt.m[2] + v.v[1] * mt.m[5] + v.v[2] * mt.m[8];
r(0) = v(0) * mt.m[0] + v(1) * mt.m[3] + v(2) * mt.m[6];
r(1) = v(0) * mt.m[1] + v(1) * mt.m[4] + v(2) * mt.m[7];
r(2) = v(0) * mt.m[2] + v(1) * mt.m[5] + v(2) * mt.m[8];
return r;
return r;*/
}
/*
Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t)
{
const float epsilon = 1e-6f;
@@ -767,31 +664,17 @@ namespace ZL {
result.v[3] = coeff1 * q1_norm.v[3] + coeff2 * q2_adjusted.v[3];
return result.normalized();
}
}*/
Matrix4f MakeMatrix4x4(const Matrix3f& m, const Vector3f pos)
{
Matrix4f r;
Eigen::Matrix4f MakeMatrix4x4(const Eigen::Matrix3f& m, const Eigen::Vector3f& pos) {
Eigen::Matrix4f r = Eigen::Matrix4f::Identity();
r.m[0] = m.m[0];
r.m[1] = m.m[1];
r.m[2] = m.m[2];
r.m[3] = 0;
// Копируем 3x3 матрицу в верхний левый угол
r.block<3, 3>(0, 0) = m;
r.m[4] = m.m[3];
r.m[5] = m.m[4];
r.m[6] = m.m[5];
r.m[7] = 0;
// Копируем позицию в последний столбец (первые 3 элемента)
r.block<3, 1>(0, 3) = pos;
r.m[8] = m.m[6];
r.m[9] = m.m[7];
r.m[10] = m.m[8];
r.m[11] = 0;
r.m[12] = pos.v[0];
r.m[13] = pos.v[1];
r.m[14] = pos.v[2];
r.m[15] = 1.0;
return r;
}
+34 -26
View File
@@ -4,9 +4,17 @@
#include <exception>
#include <stdexcept>
#include <cmath>
#include <Eigen/Dense>
namespace ZL {
using Eigen::Vector2f;
using Eigen::Vector3f;
using Eigen::Vector4f;
using Eigen::Matrix3f;
using Eigen::Matrix4f;
/*
struct Vector4f
{
Vector4f()
@@ -39,8 +47,8 @@ namespace ZL {
double dot(const Vector4f& other) const {
return v[0] * other.v[0] + v[1] * other.v[1] + v[2] * other.v[2] + v[3] * other.v[3];
}
};
};*/
/*
struct Vector3f
{
std::array<float, 3> v = { 0.f, 0.f, 0.f };
@@ -94,10 +102,10 @@ namespace ZL {
if (v[1] != other.v[1]) return v[1] < other.v[1];
return v[2] < other.v[2];
}
};
};*/
/*
struct Vector2f
{
std::array<float, 2> v = {0.f, 0.f};
@@ -115,17 +123,17 @@ namespace ZL {
Vector2f operator+(const Vector2f& x, const Vector2f& y);
Vector2f operator-(const Vector2f& x, const Vector2f& y);
Vector3f operator+(const Vector3f& x, const Vector3f& y);
*/
//Vector3f operator+(const Vector3f& x, const Vector3f& y);
Vector3f operator-(const Vector3f& x, const Vector3f& y);
Vector4f operator+(const Vector4f& x, const Vector4f& y);
//Vector3f operator-(const Vector3f& x, const Vector3f& y);
//Vector4f operator+(const Vector4f& x, const Vector4f& y);
Vector4f operator-(const Vector4f& x, const Vector4f& y);
Vector3f operator-(const Vector3f& x);
//Vector4f operator-(const Vector4f& x, const Vector4f& y);
//Vector3f operator-(const Vector3f& x);
/*
struct Matrix3f
{
std::array<float, 9> m = { 0.f, 0.f, 0.f,
@@ -133,8 +141,8 @@ namespace ZL {
0.f, 0.f, 0.f, };
static Matrix3f Identity();
};
};*/
/*
struct Matrix4f
{
std::array<float, 16> m = { 0.f, 0.f, 0.f, 0.f,
@@ -154,36 +162,36 @@ namespace ZL {
return m[col * 4 + row];
}
};
Matrix4f operator*(const Matrix4f& m1, const Matrix4f& m2);
*/
//Matrix4f operator*(const Matrix4f& m1, const Matrix4f& m2);
Matrix4f MakeOrthoMatrix(float width, float height, float zNear, float zFar);
Matrix4f MakeOrthoMatrix(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar);
Matrix4f MakePerspectiveMatrix(float fovY, float aspectRatio, float zNear, float zFar);
Matrix3f QuatToMatrix(const Vector4f& q);
Matrix3f QuatToMatrix(const Eigen::Quaternionf& q);
Vector4f MatrixToQuat(const Matrix3f& m);
Eigen::Quaternionf MatrixToQuat(const Matrix3f& m);
Vector4f QuatFromRotateAroundX(float angle);
Vector4f QuatFromRotateAroundY(float angle);
Vector4f QuatFromRotateAroundZ(float angle);
Eigen::Quaternionf QuatFromRotateAroundX(float angle);
Eigen::Quaternionf QuatFromRotateAroundY(float angle);
Eigen::Quaternionf QuatFromRotateAroundZ(float angle);
Vector2f operator*(Vector2f v, float scale);
Vector3f operator*(Vector3f v, float scale);
Vector4f operator*(Vector4f v, float scale);
//Vector2f operator*(Vector2f v, float scale);
//Vector3f operator*(Vector3f v, float scale);
//Vector4f operator*(Vector4f v, float scale);
Vector3f MultVectorMatrix(Vector3f v, Matrix3f mt);
Vector4f MultVectorMatrix(Vector4f v, Matrix4f mt);
Vector4f MultMatrixVector(Matrix4f mt, Vector4f v);
Vector3f MultMatrixVector(Matrix3f mt, Vector3f v);
Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t);
//Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t);
Matrix3f InverseMatrix(const Matrix3f& m);
Matrix4f InverseMatrix(const Matrix4f& m);
Matrix3f MultMatrixMatrix(const Matrix3f& m1, const Matrix3f& m2);
Matrix4f MultMatrixMatrix(const Matrix4f& m1, const Matrix4f& m2);
Matrix4f MakeMatrix4x4(const Matrix3f& m, const Vector3f pos);
Matrix4f MakeMatrix4x4(const Eigen::Matrix3f& m, const Eigen::Vector3f& pos);
};