2 public struct Vector3 : IEquatable<Vector3> {
73 public Vector3(
float x,
float y,
float z) {
97 public static implicit
operator Vector3((
float X,
float Y,
float Z) v) =>
new(v.X, v.Y, v.Z);
101 public override int GetHashCode() =>
X.GetHashCode() +
Y.GetHashCode() +
Z.GetHashCode();
103 public override string ToString() => $
"{X},{Y},{Z}";
135 Math.Clamp(v.
X, min, max),
136 Math.Clamp(v.
Y, min, max),
137 Math.Clamp(v.
Z, min, max)
156 return !(num > 0f) ?
UnitX : v / num;
161 return num > maxLength * maxLength ? v * (maxLength / MathF.Sqrt(num)) : v;
165 v.X * m.M11 + v.Y * m.M21 + v.Z * m.M31 + m.
M41,
166 v.X * m.M12 + v.Y * m.M22 + v.Z * m.M32 + m.
M42,
167 v.X * m.M13 + v.Y * m.M23 + v.Z * m.M33 + m.M43
172 v.X * m.M11 + v.Y * m.M21 + v.Z * m.M31 + m.M41,
173 v.X * m.M12 + v.Y * m.M22 + v.Z * m.M32 + m.M42,
174 v.X * m.M13 + v.Y * m.M23 + v.Z * m.M33 + m.M43
179 float num = q.X + q.
X;
180 float num2 = q.Y + q.
Y;
181 float num3 = q.Z + q.
Z;
182 float num4 = q.W * num;
183 float num5 = q.W * num2;
184 float num6 = q.W * num3;
185 float num7 = q.X * num;
186 float num8 = q.X * num2;
187 float num9 = q.X * num3;
188 float num10 = q.Y * num2;
189 float num11 = q.Y * num3;
190 float num12 = q.Z * num3;
192 v.
X * (1f - num10 - num12) + v.
Y * (num8 - num6) + v.
Z * (num9 + num5),
193 v.
X * (num8 + num6) + v.
Y * (1f - num7 - num12) + v.
Z * (num11 - num4),
194 v.
X * (num9 - num5) + v.
Y * (num11 + num4) + v.
Z * (1f - num7 - num10)
199 float num = q.X + q.X;
200 float num2 = q.Y + q.Y;
201 float num3 = q.Z + q.Z;
202 float num4 = q.W * num;
203 float num5 = q.W * num2;
204 float num6 = q.W * num3;
205 float num7 = q.X * num;
206 float num8 = q.X * num2;
207 float num9 = q.X * num3;
208 float num10 = q.Y * num2;
209 float num11 = q.Y * num3;
210 float num12 = q.Z * num3;
212 v.X * (1f - num10 - num12) + v.Y * (num8 - num6) + v.Z * (num9 + num5),
213 v.X * (num8 + num6) + v.Y * (1f - num7 - num12) + v.Z * (num11 - num4),
214 v.X * (num9 - num5) + v.Y * (num11 + num4) + v.Z * (1f - num7 - num10)
222 int destinationIndex,
224 for (
int i = 0; i < count; i++) {
225 Vector3 vector = sourceArray[sourceIndex + i];
226 destinationArray[destinationIndex + i] =
new Vector3(
227 vector.
X * m.M11 + vector.
Y * m.M21 + vector.
Z * m.M31 + m.M41,
228 vector.
X * m.M12 + vector.
Y * m.M22 + vector.
Z * m.M32 + m.M42,
229 vector.
X * m.M13 + vector.
Y * m.M23 + vector.
Z * m.M33 + m.M43
235 v.X * m.M11 + v.Y * m.M21 + v.Z * m.
M31,
236 v.X * m.M12 + v.Y * m.M22 + v.Z * m.
M32,
237 v.X * m.M13 + v.Y * m.M23 + v.Z * m.M33
242 v.X * m.M11 + v.Y * m.M21 + v.Z * m.M31,
243 v.X * m.M12 + v.Y * m.M22 + v.Z * m.M32,
244 v.X * m.M13 + v.Y * m.M23 + v.Z * m.M33
252 int destinationIndex,
254 for (
int i = 0; i < count; i++) {
255 Vector3 vector = sourceArray[sourceIndex + i];
256 destinationArray[destinationIndex + i] =
new Vector3(
257 vector.
X * m.M11 + vector.
Y * m.M21 + vector.
Z * m.M31,
258 vector.
X * m.M12 + vector.
Y * m.M22 + vector.
Z * m.M32,
259 vector.
X * m.M13 + vector.
Y * m.M23 + vector.
Z * m.M33
286 return new Vector3(v.
X * num, v.
Y * num, v.
Z * num);
290 if (
float.IsNaN(v.
X)) {
293 if (
float.IsNaN(v.
Y)) {
296 if (
float.IsNaN(v.
Z)) {
303 if (
float.IsNaN(
X)) {
306 if (
float.IsNaN(
Y)) {
309 if (
float.IsNaN(
Z)) {
316 fixed (
float* ptr = &
X) {
317 return new Span<float>(ptr, 3);
322 fixed (
float* ptr = &
X) {
static float Saturate(float x)
static float CatmullRom(float v1, float v2, float v3, float v4, float f)
static float Lerp(float x1, float x2, float f)
static Vector3 Round(Vector3 v)
static void Transform(ref Vector3 v, ref Matrix m, out Vector3 result)
static float DistanceSquared(Vector3 v1, Vector3 v2)
static void Transform(Vector3[] sourceArray, int sourceIndex, ref Matrix m, Vector3[] destinationArray, int destinationIndex, int count)
static Vector3 Max(Vector3 v1, Vector3 v2)
static readonly Vector3 One
static Vector3 Lerp(Vector3 v1, Vector3 v2, float f)
Vector3(float x, float y, float z)
static Vector3 Clamp(Vector3 v, float min, float max)
static void Transform(ref Vector3 v, ref Quaternion q, out Vector3 result)
static void TransformNormal(Vector3[] sourceArray, int sourceIndex, ref Matrix m, Vector3[] destinationArray, int destinationIndex, int count)
static Vector3 Floor(Vector3 v)
static Vector3 TransformNormal(Vector3 v, Matrix m)
override string ToString()
static Vector3 Transform(Vector3 v, Matrix m)
static Vector3 operator+(Vector3 v)
static Vector3 FixNaN(Vector3 v)
unsafe Span< float > AsSpan()
static Vector3 LimitLength(Vector3 v, float maxLength)
static bool operator==(Vector3 v1, Vector3 v2)
static Vector3 Cross(Vector3 v1, Vector3 v2)
static Vector3 Normalize(Vector3 v)
static readonly Vector3 Zero
static Vector3 Saturate(Vector3 v)
static bool operator!=(Vector3 v1, Vector3 v2)
static float Distance(Vector3 v1, Vector3 v2)
static Vector3 Max(Vector3 v, float f)
Vector3(Vector2 xy, float z)
static Vector3 Ceiling(Vector3 v)
static Vector3 Min(Vector3 v1, Vector3 v2)
static Vector3 Min(Vector3 v, float f)
static readonly Vector3 UnitX
static Vector3 Transform(Vector3 v, Quaternion q)
static Vector3 CatmullRom(Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float f)
static Vector3 operator*(Vector3 v1, Vector3 v2)
static Vector3 operator/(Vector3 v1, Vector3 v2)
static readonly Vector3 UnitY
bool Equals(Vector3 other)
unsafe float * AsPointer()
override int GetHashCode()
static Vector3 operator-(Vector3 v)
static void TransformNormal(ref Vector3 v, ref Matrix m, out Vector3 result)
static readonly Vector3 UnitZ
override bool Equals(object obj)
static float Dot(Vector3 v1, Vector3 v2)