Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
BasePerspectiveCamera.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public abstract class BasePerspectiveCamera : Camera {
7
9
11
13
15
17
19
21
23
25
27
29
31
32 public bool m_viewFrustumValid;
33
35
37
38 public override Vector3 ViewUp => m_viewUp;
39
40 public override Vector3 ViewRight => m_viewRight;
41
42 public override Matrix ViewMatrix //视图矩阵,包含观测的位置,方向,垂直Y方向
43 {
44 get {
45 if (!m_viewMatrix.HasValue) {
47 }
48 return m_viewMatrix.Value;
49 }
50 }
51
52 public override Matrix InvertedViewMatrix //转置视图矩阵
53 {
54 get {
55 if (!m_invertedViewMatrix.HasValue) {
57 }
58 return m_invertedViewMatrix.Value;
59 }
60 }
61
62 public override Matrix ProjectionMatrix {
63 get {
64 if (!m_projectionMatrix.HasValue) {
66 ViewWidget viewWidget = GameWidget.ViewWidget;
67 if (!viewWidget.ScalingRenderTargetSize.HasValue) {
69 0.5f * viewWidget.ActualSize.X,
70 -0.5f * viewWidget.ActualSize.Y,
71 viewWidget.ActualSize.X / 2f,
72 viewWidget.ActualSize.Y / 2f
73 )
74 * viewWidget.GlobalTransform
76 }
77 }
78 return m_projectionMatrix.Value;
79 }
80 }
81
83 get {
84 if (!m_screenProjectionMatrix.HasValue) {
85 Point2 size = Window.Size;
86 ViewWidget viewWidget = GameWidget.ViewWidget;
89 0.5f * viewWidget.ActualSize.X,
90 -0.5f * viewWidget.ActualSize.Y,
91 viewWidget.ActualSize.X / 2f,
92 viewWidget.ActualSize.Y / 2f
93 )
94 * viewWidget.GlobalTransform
95 * MatrixUtils.CreateScaleTranslation(2f / size.X, -2f / size.Y, -1f, 1f);
96 }
97 return m_screenProjectionMatrix.Value;
98 }
99 }
100
102 get {
103 if (!m_invertedProjectionMatrix.HasValue) {
105 }
106 return m_invertedProjectionMatrix.Value;
107 }
108 }
109
110 public override Matrix ViewProjectionMatrix {
111 get {
112 if (!m_viewProjectionMatrix.HasValue) {
113 //世界坐标矩阵 * 投影矩阵得到屏幕矩阵,即将世界的坐标转换到屏幕的坐标
115 /*
116 //测试,将屏幕坐标转回到世界坐标
117 //将屏幕坐标的0,0转换到世界的坐标中
118 Vector3 vector = Vector3.Transform(Vector3.Zero, InvertedProjectionMatrix);
119 vector = Vector3.Transform(vector,InvertedViewMatrix);
120 */
121 }
122 return m_viewProjectionMatrix.Value;
123 }
124 }
125
126 public override Vector2 ViewportSize {
127 get {
128 if (!m_viewportSize.HasValue) {
129 ViewWidget viewWidget = GameWidget.ViewWidget;
130 m_viewportSize = viewWidget.ScalingRenderTargetSize.HasValue
131 ? new Vector2(viewWidget.ScalingRenderTargetSize.Value)
132 : new Vector2(
133 viewWidget.ActualSize.X * viewWidget.GlobalTransform.Right.Length(),
134 viewWidget.ActualSize.Y * viewWidget.GlobalTransform.Up.Length()
135 );
136 }
137 return m_viewportSize.Value;
138 }
139 }
140
141 public override Matrix ViewportMatrix {
142 get {
143 if (!m_viewportMatrix.HasValue) {
144 ViewWidget viewWidget = GameWidget.ViewWidget;
145 if (viewWidget.ScalingRenderTargetSize.HasValue) {
147 }
148 else {
149 Matrix identity = Matrix.Identity;
150 identity.Right = Vector3.Normalize(viewWidget.GlobalTransform.Right);
151 identity.Up = Vector3.Normalize(viewWidget.GlobalTransform.Up);
152 identity.Forward = viewWidget.GlobalTransform.Forward;
153 identity.Translation = viewWidget.GlobalTransform.Translation;
154 m_viewportMatrix = identity;
155 }
156 }
157 return m_viewportMatrix.Value;
158 }
159 }
160
161 public override BoundingFrustum ViewFrustum {
162 get {
163 if (!m_viewFrustumValid) {
164 if (m_viewFrustum == null) {
166 }
167 else {
168 m_viewFrustum.Matrix = ViewProjectionMatrix;
169 }
170 m_viewFrustumValid = true;
171 }
172 return m_viewFrustum;
173 }
174 }
175
176 public override void PrepareForDrawing() {
177 m_viewMatrix = null;
179 m_projectionMatrix = null;
183 m_viewportSize = null;
184 m_viewportMatrix = null;
185 m_viewFrustumValid = false;
186 }
187
188 public BasePerspectiveCamera(GameWidget gameWidget) : base(gameWidget) { }
189
190 public void SetupPerspectiveCamera(Vector3 position, Vector3 direction, Vector3 up) {
191 m_viewPosition = position;
192 m_viewDirection = Vector3.Normalize(direction);
195 }
196
202 Matrix result;
203 if (!Eye.HasValue) {
204 float viewAngle = 80f * SettingsManager.ViewAngle;
205 ViewWidget viewWidget = GameWidget.ViewWidget;
206 float aspectRatio = viewWidget.ActualSize.X / viewWidget.ActualSize.Y; //视野长宽比
207 result = Matrix.CreatePerspectiveFieldOfView(MathUtils.DegToRad(viewAngle), aspectRatio, 0.1f, 2048f); //参数1视野Y宽度,参数2纵横比,参数3近平面,参数4远平面
208 }
209 else {
210 result = VrManager.GetProjectionMatrix(Eye.Value, 0.1f, 2048f);
211 }
213 "RecalculateCameraProjection",
214 loader => {
215 loader.RecalculateCameraProjection(this, ref result);
216 return false;
217 }
218 );
219 return result;
220 }
221 }
222}
static Viewport Viewport
static float DegToRad(float degrees)
static Point2 Size
BasePerspectiveCamera(GameWidget gameWidget)
virtual Matrix CalculateBaseProjectionMatrix()
计算基础投影矩阵,创建透视视野
void SetupPerspectiveCamera(Vector3 position, Vector3 direction, Vector3 up)
GameWidget GameWidget
Camera(GameWidget gameWidget)
static Matrix CreateScaleTranslation(float sx, float sy, float tx, float ty)
Point2? ScalingRenderTargetSize
static Matrix GetProjectionMatrix(VrEye eye, float near, float far)
Vector2 ActualSize
Matrix GlobalTransform
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
static Matrix Invert(Matrix m)
static Matrix CreatePerspectiveFieldOfView(float fieldOfViewY, float aspectRatio, float nearPlane, float farPlane)
static readonly Matrix Identity
static Matrix CreateLookAt(Vector3 position, Vector3 target, Vector3 up)
Vector3 Translation
Vector3 Forward
static Vector3 Cross(Vector3 v1, Vector3 v2)
static Vector3 Normalize(Vector3 v)