Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
Ray3.cs
浏览该文件的文档.
1namespace Engine {
2 public struct Ray3 : IEquatable<Ray3> {
4
6
7 public Ray3(Vector3 position, Vector3 direction) {
8 Position = position;
9 Direction = direction;
10 }
11
12 public override bool Equals(object obj) => obj is Ray3 && Equals((Ray3)obj);
13
14 public override int GetHashCode() => Position.GetHashCode() + Direction.GetHashCode();
15
16 public override string ToString() => $"{Position.ToString()},{Direction.ToString()}";
17
18 public bool Equals(Ray3 other) => Position == other.Position && Direction == other.Direction;
19
20 public float? Intersection(BoundingBox box) {
21 if (Position.X >= box.Min.X
22 && Position.X <= box.Max.X
23 && Position.Y >= box.Min.Y
24 && Position.Y <= box.Max.Y
25 && Position.Z >= box.Min.Z
26 && Position.Z <= box.Max.Z) {
27 return 0f;
28 }
29 Vector3 vector = new(-1f);
30 if (Direction.X != 0f) {
31 if (Position.X < box.Min.X) {
32 vector.X = (box.Min.X - Position.X) / Direction.X;
33 }
34 else if (Position.X > box.Max.X) {
35 vector.X = (box.Max.X - Position.X) / Direction.X;
36 }
37 }
38 if (Direction.Y != 0f) {
39 if (Position.Y < box.Min.Y) {
40 vector.Y = (box.Min.Y - Position.Y) / Direction.Y;
41 }
42 else if (Position.Y > box.Max.Y) {
43 vector.Y = (box.Max.Y - Position.Y) / Direction.Y;
44 }
45 }
46 if (Direction.Z != 0f) {
47 if (Position.Z < box.Min.Z) {
48 vector.Z = (box.Min.Z - Position.Z) / Direction.Z;
49 }
50 else if (Position.Z > box.Max.Z) {
51 vector.Z = (box.Max.Z - Position.Z) / Direction.Z;
52 }
53 }
54 if (vector.X > vector.Y
55 && vector.X > vector.Z) {
56 if (vector.X < 0f) {
57 return null;
58 }
59 float num = Position.Z + vector.X * Direction.Z;
60 if (num < box.Min.Z
61 || num > box.Max.Z) {
62 return null;
63 }
64 num = Position.Y + vector.X * Direction.Y;
65 return num < box.Min.Y || num > box.Max.Y ? null : vector.X;
66 }
67 if (vector.Y > vector.X
68 && vector.Y > vector.Z) {
69 if (vector.Y < 0f) {
70 return null;
71 }
72 float num2 = Position.Z + vector.Y * Direction.Z;
73 if (num2 < box.Min.Z
74 || num2 > box.Max.Z) {
75 return null;
76 }
77 num2 = Position.X + vector.Y * Direction.X;
78 return num2 < box.Min.X || num2 > box.Max.X ? null : vector.Y;
79 }
80 if (vector.Z < 0f) {
81 return null;
82 }
83 float num3 = Position.X + vector.Z * Direction.X;
84 if (num3 < box.Min.X
85 || num3 > box.Max.X) {
86 return null;
87 }
88 num3 = Position.Y + vector.Z * Direction.Y;
89 return num3 < box.Min.Y || num3 > box.Max.Y ? null : vector.Z;
90 }
91
92 public float? Intersection(BoundingSphere sphere) {
93 Vector3 v = sphere.Center - Position;
94 float num = v.LengthSquared();
95 float num2 = sphere.Radius * sphere.Radius;
96 if (num < num2) {
97 return 0f;
98 }
99 float num3 = Vector3.Dot(Direction, v);
100 if (num3 < 0f) {
101 return null;
102 }
103 float num4 = num2 + num3 * num3 - num;
104 return !(num4 < 0f) ? num3 - MathF.Sqrt(num4) : null;
105 }
106
107 public float? Intersection(Plane plane) {
108 float num = Vector3.Dot(Direction, plane.Normal);
109 return num == 0f ? null : (0f - (Vector3.Dot(Position, plane.Normal) + plane.D)) / num;
110 }
111
112 public Vector3 Sample(float distance) => Position + Direction * distance;
113
114 public static Ray3 Transform(Ray3 r, Matrix m) {
115 Transform(ref r, ref m, out Ray3 result);
116 return result;
117 }
118
119 public static void Transform(ref Ray3 r, ref Matrix m, out Ray3 result) {
120 Vector3.Transform(ref r.Position, ref m, out result.Position);
121 Vector3.TransformNormal(ref r.Direction, ref m, out result.Direction);
122 }
123
124 public static bool operator ==(Ray3 a, Ray3 b) => a.Equals(b);
125
126 public static bool operator !=(Ray3 a, Ray3 b) => !a.Equals(b);
127 }
128}
Vector3 Normal
定义 Plane.cs:3
static bool operator==(Ray3 a, Ray3 b)
static bool operator!=(Ray3 a, Ray3 b)
static Ray3 Transform(Ray3 r, Matrix m)
Ray3(Vector3 position, Vector3 direction)
定义 Ray3.cs:7
float? Intersection(BoundingSphere sphere)
定义 Ray3.cs:92
override int GetHashCode()
定义 Ray3.cs:14
override bool Equals(object obj)
定义 Ray3.cs:12
Vector3 Sample(float distance)
override string ToString()
定义 Ray3.cs:16
static void Transform(ref Ray3 r, ref Matrix m, out Ray3 result)
float? Intersection(Plane plane)
Vector3 Position
定义 Ray3.cs:3
Vector3 Direction
定义 Ray3.cs:5
bool Equals(Ray3 other)
定义 Ray3.cs:18
float? Intersection(BoundingBox box)
定义 Ray3.cs:20
static Vector3 TransformNormal(Vector3 v, Matrix m)
static Vector3 Transform(Vector3 v, Matrix m)
float LengthSquared()
static float Dot(Vector3 v1, Vector3 v2)