#pragma once #include 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