77 lines
1.9 KiB
C++
77 lines
1.9 KiB
C++
#pragma once
|
|
|
|
#include <cmath>
|
|
|
|
namespace extra2d {
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// 3D 向量 (用于3D动作)
|
|
// ---------------------------------------------------------------------------
|
|
struct Vec3 {
|
|
float x = 0.0f;
|
|
float y = 0.0f;
|
|
float z = 0.0f;
|
|
|
|
constexpr Vec3() = default;
|
|
constexpr Vec3(float x, float y, float z) : x(x), y(y), z(z) {}
|
|
|
|
Vec3 operator+(const Vec3 &v) const { return {x + v.x, y + v.y, z + v.z}; }
|
|
Vec3 operator-(const Vec3 &v) const { return {x - v.x, y - v.y, z - v.z}; }
|
|
Vec3 operator*(float s) const { return {x * s, y * s, z * s}; }
|
|
Vec3 operator/(float s) const { return {x / s, y / s, z / s}; }
|
|
Vec3 operator-() const { return {-x, -y, -z}; }
|
|
|
|
Vec3 &operator+=(const Vec3 &v) {
|
|
x += v.x;
|
|
y += v.y;
|
|
z += v.z;
|
|
return *this;
|
|
}
|
|
Vec3 &operator-=(const Vec3 &v) {
|
|
x -= v.x;
|
|
y -= v.y;
|
|
z -= v.z;
|
|
return *this;
|
|
}
|
|
Vec3 &operator*=(float s) {
|
|
x *= s;
|
|
y *= s;
|
|
z *= s;
|
|
return *this;
|
|
}
|
|
Vec3 &operator/=(float s) {
|
|
x /= s;
|
|
y /= s;
|
|
z /= s;
|
|
return *this;
|
|
}
|
|
|
|
bool operator==(const Vec3 &v) const {
|
|
return x == v.x && y == v.y && z == v.z;
|
|
}
|
|
bool operator!=(const Vec3 &v) const { return !(*this == v); }
|
|
|
|
float length() const { return std::sqrt(x * x + y * y + z * z); }
|
|
float lengthSquared() const { return x * x + y * y + z * z; }
|
|
|
|
Vec3 normalized() const {
|
|
float len = length();
|
|
if (len > 0.0f)
|
|
return {x / len, y / len, z / len};
|
|
return {0.0f, 0.0f, 0.0f};
|
|
}
|
|
|
|
float dot(const Vec3 &v) const { return x * v.x + y * v.y + z * v.z; }
|
|
|
|
static Vec3 lerp(const Vec3 &a, const Vec3 &b, float t) {
|
|
return a + (b - a) * t;
|
|
}
|
|
|
|
static constexpr Vec3 Zero() { return {0.0f, 0.0f, 0.0f}; }
|
|
static constexpr Vec3 One() { return {1.0f, 1.0f, 1.0f}; }
|
|
};
|
|
|
|
inline Vec3 operator*(float s, const Vec3 &v) { return v * s; }
|
|
|
|
} // namespace extra2d
|