Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
Vector3.cs
浏览该文件的文档.
1namespace Engine {
2 public struct Vector3 : IEquatable<Vector3> {
3 public float X;
4
5 public float Y;
6
7 public float Z;
8
9 public static readonly Vector3 Zero = new(0f);
10
11 public static readonly Vector3 One = new(1f);
12
13 public static readonly Vector3 UnitX = new(1f, 0f, 0f);
14
15 public static readonly Vector3 UnitY = new(0f, 1f, 0f);
16
17 public static readonly Vector3 UnitZ = new(0f, 0f, 1f);
18
19 public Vector2 XY {
20 get => new(X, Y);
21 set {
22 X = value.X;
23 Y = value.Y;
24 }
25 }
26
27 public Vector2 YX {
28 get => new(Y, X);
29 set {
30 Y = value.X;
31 X = value.Y;
32 }
33 }
34
35 public Vector2 XZ {
36 get => new(X, Z);
37 set {
38 X = value.X;
39 Z = value.Y;
40 }
41 }
42
43 public Vector2 ZX {
44 get => new(Z, X);
45 set {
46 Z = value.X;
47 X = value.Y;
48 }
49 }
50
51 public Vector2 YZ {
52 get => new(Y, Z);
53 set {
54 Y = value.X;
55 Z = value.Y;
56 }
57 }
58
59 public Vector2 ZY {
60 get => new(Z, Y);
61 set {
62 Z = value.X;
63 Y = value.Y;
64 }
65 }
66
67 public Vector3(float v) {
68 X = v;
69 Y = v;
70 Z = v;
71 }
72
73 public Vector3(float x, float y, float z) {
74 X = x;
75 Y = y;
76 Z = z;
77 }
78
79 public Vector3(Vector2 xy, float z) {
80 X = xy.X;
81 Y = xy.Y;
82 Z = z;
83 }
84
85 public Vector3(Point3 p) {
86 X = p.X;
87 Y = p.Y;
88 Z = p.Z;
89 }
90
91 public Vector3(Color c) {
92 X = c.R / 255f;
93 Y = c.G / 255f;
94 Z = c.B / 255f;
95 }
96
97 public static implicit operator Vector3((float X, float Y, float Z) v) => new(v.X, v.Y, v.Z);
98
99 public override bool Equals(object obj) => obj is Vector3 && Equals((Vector3)obj);
100
101 public override int GetHashCode() => X.GetHashCode() + Y.GetHashCode() + Z.GetHashCode();
102
103 public override string ToString() => $"{X},{Y},{Z}";
104
105 public bool Equals(Vector3 other) => X == other.X && Y == other.Y && Z == other.Z;
106
107 public static float Distance(Vector3 v1, Vector3 v2) => MathF.Sqrt(DistanceSquared(v1, v2));
108
109 public static float DistanceSquared(Vector3 v1, Vector3 v2) =>
110 MathUtils.Sqr(v1.X - v2.X) + MathUtils.Sqr(v1.Y - v2.Y) + MathUtils.Sqr(v1.Z - v2.Z);
111
112 public static float Dot(Vector3 v1, Vector3 v2) => v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z;
113
114 public static Vector3 Cross(Vector3 v1, Vector3 v2) => new(v1.Y * v2.Z - v1.Z * v2.Y, v1.Z * v2.X - v1.X * v2.Z, v1.X * v2.Y - v1.Y * v2.X);
115
116 public float Length() => MathF.Sqrt(LengthSquared());
117
118 public float LengthSquared() => X * X + Y * Y + Z * Z;
119
120 public static Vector3 Floor(Vector3 v) => new(MathF.Floor(v.X), MathF.Floor(v.Y), MathF.Floor(v.Z));
121
122 public static Vector3 Ceiling(Vector3 v) => new(MathF.Ceiling(v.X), MathF.Ceiling(v.Y), MathF.Ceiling(v.Z));
123
124 public static Vector3 Round(Vector3 v) => new(MathF.Round(v.X), MathF.Round(v.Y), MathF.Round(v.Z));
125
126 public static Vector3 Min(Vector3 v, float f) => new(MathF.Min(v.X, f), MathF.Min(v.Y, f), MathF.Min(v.Z, f));
127
128 public static Vector3 Min(Vector3 v1, Vector3 v2) => new(MathF.Min(v1.X, v2.X), MathF.Min(v1.Y, v2.Y), MathF.Min(v1.Z, v2.Z));
129
130 public static Vector3 Max(Vector3 v, float f) => new(MathF.Max(v.X, f), MathF.Max(v.Y, f), MathF.Max(v.Z, f));
131
132 public static Vector3 Max(Vector3 v1, Vector3 v2) => new(MathF.Max(v1.X, v2.X), MathF.Max(v1.Y, v2.Y), MathF.Max(v1.Z, v2.Z));
133
134 public static Vector3 Clamp(Vector3 v, float min, float max) => new(
135 Math.Clamp(v.X, min, max),
136 Math.Clamp(v.Y, min, max),
137 Math.Clamp(v.Z, min, max)
138 );
139
141
142 public static Vector3 Lerp(Vector3 v1, Vector3 v2, float f) => new(
143 MathUtils.Lerp(v1.X, v2.X, f),
144 MathUtils.Lerp(v1.Y, v2.Y, f),
145 MathUtils.Lerp(v1.Z, v2.Z, f)
146 );
147
148 public static Vector3 CatmullRom(Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float f) => new(
149 MathUtils.CatmullRom(v1.X, v2.X, v3.X, v4.X, f),
150 MathUtils.CatmullRom(v1.Y, v2.Y, v3.Y, v4.Y, f),
151 MathUtils.CatmullRom(v1.Z, v2.Z, v3.Z, v4.Z, f)
152 );
153
154 public static Vector3 Normalize(Vector3 v) {
155 float num = v.Length();
156 return !(num > 0f) ? UnitX : v / num;
157 }
158
159 public static Vector3 LimitLength(Vector3 v, float maxLength) {
160 float num = v.LengthSquared();
161 return num > maxLength * maxLength ? v * (maxLength / MathF.Sqrt(num)) : v;
162 }
163
164 public static Vector3 Transform(Vector3 v, Matrix m) => new(
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
168 );
169
170 public static void Transform(ref Vector3 v, ref Matrix m, out Vector3 result) {
171 result = new Vector3(
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
175 );
176 }
177
178 public static Vector3 Transform(Vector3 v, Quaternion q) {
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;
191 return new Vector3(
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)
195 );
196 }
197
198 public static void Transform(ref Vector3 v, ref Quaternion q, out Vector3 result) {
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;
211 result = new Vector3(
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)
215 );
216 }
217
218 public static void Transform(Vector3[] sourceArray,
219 int sourceIndex,
220 ref Matrix m,
221 Vector3[] destinationArray,
222 int destinationIndex,
223 int count) {
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
230 );
231 }
232 }
233
234 public static Vector3 TransformNormal(Vector3 v, Matrix m) => new(
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
238 );
239
240 public static void TransformNormal(ref Vector3 v, ref Matrix m, out Vector3 result) {
241 result = new Vector3(
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
245 );
246 }
247
248 public static void TransformNormal(Vector3[] sourceArray,
249 int sourceIndex,
250 ref Matrix m,
251 Vector3[] destinationArray,
252 int destinationIndex,
253 int count) {
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
260 );
261 }
262 }
263
264 public static bool operator ==(Vector3 v1, Vector3 v2) => v1.Equals(v2);
265
266 public static bool operator !=(Vector3 v1, Vector3 v2) => !v1.Equals(v2);
267
268 public static Vector3 operator +(Vector3 v) => v;
269
270 public static Vector3 operator -(Vector3 v) => new(0f - v.X, 0f - v.Y, 0f - v.Z);
271
272 public static Vector3 operator +(Vector3 v1, Vector3 v2) => new(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);
273
274 public static Vector3 operator -(Vector3 v1, Vector3 v2) => new(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z);
275
276 public static Vector3 operator *(Vector3 v1, Vector3 v2) => new(v1.X * v2.X, v1.Y * v2.Y, v1.Z * v2.Z);
277
278 public static Vector3 operator *(Vector3 v, float s) => new(v.X * s, v.Y * s, v.Z * s);
279
280 public static Vector3 operator *(float s, Vector3 v) => new(v.X * s, v.Y * s, v.Z * s);
281
282 public static Vector3 operator /(Vector3 v1, Vector3 v2) => new(v1.X / v2.X, v1.Y / v2.Y, v1.Z / v2.Z);
283
284 public static Vector3 operator /(Vector3 v, float d) {
285 float num = 1f / d;
286 return new Vector3(v.X * num, v.Y * num, v.Z * num);
287 }
288
289 public static Vector3 FixNaN(Vector3 v) {
290 if (float.IsNaN(v.X)) {
291 v.X = 0;
292 }
293 if (float.IsNaN(v.Y)) {
294 v.Y = 0;
295 }
296 if (float.IsNaN(v.Z)) {
297 v.Z = 0;
298 }
299 return v;
300 }
301
302 public Vector3 FixNaN() {
303 if (float.IsNaN(X)) {
304 X = 0;
305 }
306 if (float.IsNaN(Y)) {
307 Y = 0;
308 }
309 if (float.IsNaN(Z)) {
310 Z = 0;
311 }
312 return this;
313 }
314
315 public unsafe Span<float> AsSpan() {
316 fixed (float* ptr = &X) {
317 return new Span<float>(ptr, 3);
318 }
319 }
320
321 public unsafe float* AsPointer() {
322 fixed (float* ptr = &X) {
323 return ptr;
324 }
325 }
326 }
327}
unsafe
定义 Main.cs:15
Engine.Vector3 Vector3
static float Saturate(float x)
static int Sqr(int 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()
Vector3(Point3 p)
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)
float LengthSquared()
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)