使用 glm 将 vec3 与 mat4 相乘
Multiply vec3 with mat4 using glm
此刻,我将 vec3
转换为 vec4
,将其与矩阵相乘,然后将其转换回 vec3
代码:
glm::vec3 transformed = glm::vec3(matrix * glm::vec4(point, 0.0))
它有效,但我认为这不是计算它的好方法。是否可以在 vec3
上应用 mat4
,而不将其转换为 vec4
并返回?
mat4 是一个 4 x 4 矩阵,所以你需要一个 4 维向量来乘以它。
第 4 维对于 3D 数学非常有用,可以区分 3D space 点 (1) 和 3D 向量 (0)
这里我漏掉了很多运算符,但我希望你能理解。
class point3
{
public:
vec4 p;
public:
point3();
point3(const point3& rhs);
point3(const point3& rhs);
point3(float x, float y, float z);
point3& operator=(const point3&rhs);
vector3 operator-(const point3&rhs);
point3 operator+(const vector3&rhs);
point3& operator+=(const vector3&rhs);
};
point3::point3():p.x(0), p.y(0), p.z(0), p.w(1)
{
}
point3::point3(const point3& rhs):p(rhs.p)
{
}
point3::point3(const point3& rhs):p(rhs.p)
{
}
point3::point3(float x, float y, float z):p.x(x), p.y(y), p.z(z), p.w(1)
{
}
point3& point3::operator=(const point3&rhs)
{
return (p=rhs.p);
}
vector3 point3::operator-(const point3&rhs)
{
vector3 result;
result.p=(p-rhs.p);
return result;
}
point3 point3::operator+(const vector3&rhs)
{
point3 result;
result.p=(p+rhs.p);
return result;
}
point3& point3::operator+=(const vector3&rhs)
{
p=(p+rhs.p);
return p;
}
class vector3
{
public:
vec4 p;
public:
vector3();
vector3(const vector3& rhs);
vector3(const vector3& rhs);
vector3(float x, float y, float z);
vector3& operator=(const vector3&rhs);
vector3 operator-(const vector3&rhs);
point3 operator-(const point3&rhs);
point3 operator+(const point3&rhs);
vector3 operator+(const vector3&rhs);
vector3& operator+=(const vector3&rhs);
};
vector3::vector3():p.x(0), p.y(0), p.z(0), p.w(0)
{
}
vector3::vector3(const vector3& rhs):p(rhs.p)
{
}
vector3::vector3(const vector3& rhs):p(rhs.p)
{
}
vector3::vector3(float x, float y, float z):p.x(x), p.y(y), p.z(z), p.w(0)
{
}
vector3& vector3::operator=(const vector3&rhs)
{
p=rhs.p;
return p;
}
vector3 vector3::operator-(const vector3&rhs)
{
vector3 result;
result.p=(p-rhs.p);
return result;
}
point3 vector3::operator-(const point3&rhs)
{
point3 result;
result.p=(p-rhs.p);
return result;
}
point3 vector3::operator+(const point3&rhs)
{
point3 result;
result.p=(p+rhs.p);
return result;
}
vector3 vector3::operator+(const vector3&rhs)
{
vector3 result;
result.p=(p+rhs.p);
return result;
}
vector3& vector3::operator+=(const vector3&rhs)
{
p=(p+rhs.p);
return p;
}
在使用 OpenGL 时,坚持使用 homogeneous coordinates 是非常明智的。对于 3D space,这些是 4D 向量,通常第四个元素等于 1。当你这样做时,你的所有计算都是 4 维的 space,所以任何地方都不需要转换。
另请注意,在您的示例中,您实际上会丢失可能已记录在转换矩阵中的任何翻译。如果你想保留这个,你需要为第 4 个元素使用 1,而不是 0。
Appendix F of the Red Book 描述了在 OpenGL 中如何以及为什么使用齐次坐标。
此刻,我将 vec3
转换为 vec4
,将其与矩阵相乘,然后将其转换回 vec3
代码:
glm::vec3 transformed = glm::vec3(matrix * glm::vec4(point, 0.0))
它有效,但我认为这不是计算它的好方法。是否可以在 vec3
上应用 mat4
,而不将其转换为 vec4
并返回?
mat4 是一个 4 x 4 矩阵,所以你需要一个 4 维向量来乘以它。
第 4 维对于 3D 数学非常有用,可以区分 3D space 点 (1) 和 3D 向量 (0)
这里我漏掉了很多运算符,但我希望你能理解。
class point3
{
public:
vec4 p;
public:
point3();
point3(const point3& rhs);
point3(const point3& rhs);
point3(float x, float y, float z);
point3& operator=(const point3&rhs);
vector3 operator-(const point3&rhs);
point3 operator+(const vector3&rhs);
point3& operator+=(const vector3&rhs);
};
point3::point3():p.x(0), p.y(0), p.z(0), p.w(1)
{
}
point3::point3(const point3& rhs):p(rhs.p)
{
}
point3::point3(const point3& rhs):p(rhs.p)
{
}
point3::point3(float x, float y, float z):p.x(x), p.y(y), p.z(z), p.w(1)
{
}
point3& point3::operator=(const point3&rhs)
{
return (p=rhs.p);
}
vector3 point3::operator-(const point3&rhs)
{
vector3 result;
result.p=(p-rhs.p);
return result;
}
point3 point3::operator+(const vector3&rhs)
{
point3 result;
result.p=(p+rhs.p);
return result;
}
point3& point3::operator+=(const vector3&rhs)
{
p=(p+rhs.p);
return p;
}
class vector3
{
public:
vec4 p;
public:
vector3();
vector3(const vector3& rhs);
vector3(const vector3& rhs);
vector3(float x, float y, float z);
vector3& operator=(const vector3&rhs);
vector3 operator-(const vector3&rhs);
point3 operator-(const point3&rhs);
point3 operator+(const point3&rhs);
vector3 operator+(const vector3&rhs);
vector3& operator+=(const vector3&rhs);
};
vector3::vector3():p.x(0), p.y(0), p.z(0), p.w(0)
{
}
vector3::vector3(const vector3& rhs):p(rhs.p)
{
}
vector3::vector3(const vector3& rhs):p(rhs.p)
{
}
vector3::vector3(float x, float y, float z):p.x(x), p.y(y), p.z(z), p.w(0)
{
}
vector3& vector3::operator=(const vector3&rhs)
{
p=rhs.p;
return p;
}
vector3 vector3::operator-(const vector3&rhs)
{
vector3 result;
result.p=(p-rhs.p);
return result;
}
point3 vector3::operator-(const point3&rhs)
{
point3 result;
result.p=(p-rhs.p);
return result;
}
point3 vector3::operator+(const point3&rhs)
{
point3 result;
result.p=(p+rhs.p);
return result;
}
vector3 vector3::operator+(const vector3&rhs)
{
vector3 result;
result.p=(p+rhs.p);
return result;
}
vector3& vector3::operator+=(const vector3&rhs)
{
p=(p+rhs.p);
return p;
}
在使用 OpenGL 时,坚持使用 homogeneous coordinates 是非常明智的。对于 3D space,这些是 4D 向量,通常第四个元素等于 1。当你这样做时,你的所有计算都是 4 维的 space,所以任何地方都不需要转换。
另请注意,在您的示例中,您实际上会丢失可能已记录在转换矩阵中的任何翻译。如果你想保留这个,你需要为第 4 个元素使用 1,而不是 0。
Appendix F of the Red Book 描述了在 OpenGL 中如何以及为什么使用齐次坐标。