| | |
| | | /// <param name="mouseX">屏幕坐标X(左上角为原点)</param> |
| | | /// <param name="mouseY">屏幕坐标Y(左上角为原点)</param> |
| | | /// <param name="depth">深度值(范围[0, 1],可选)</param> |
| | | /// <param name="mview">视图矩阵</param> |
| | | /// <param name="model">模型矩阵</param> |
| | | /// <param name="view">视图矩阵</param> |
| | | /// <param name="proj">投影矩阵</param> |
| | | /// <param name="viewportWidth">视口宽度</param> |
| | | /// <param name="viewportHeight">视口高度</param> |
| | | /// <returns></returns> |
| | | public static Vector3 ScreenToWorld(float mouseX, float mouseY, float depth, Matrix4 mview, Matrix4 proj, int viewportWidth, int viewportHeight) |
| | | public static Vector3 ScreenToWorld(float mouseX, float mouseY, float depth, Matrix4 model, Matrix4 view, Matrix4 proj, int viewportWidth, int viewportHeight) |
| | | { |
| | | var ndc = ScreenToNDC(mouseX, mouseY, depth, viewportWidth, viewportHeight); |
| | | var matrix = mview * proj; |
| | | var matrix = model * view * proj; |
| | | var invert = matrix.Inverted(); |
| | | // 将NDC坐标转换为世界坐标 |
| | | var wp = Vector4.TransformRow(new Vector4(ndc, 1f), invert); |
| | |
| | | /// 世界坐标 To 屏幕坐标 |
| | | /// </summary> |
| | | /// <param name="wp">世界坐标</param> |
| | | /// <param name="mview">视图矩阵</param> |
| | | /// <param name="model">模型矩阵</param> |
| | | /// <param name="view">视图矩阵</param> |
| | | /// <param name="proj">投影矩阵</param> |
| | | /// <param name="wiewportWidth">视口宽度</param> |
| | | /// <param name="viewportHeight">视口高度</param> |
| | | /// <returns></returns> |
| | | public static Vector2 WorldToScreen(Vector3 wp, Matrix4 mview, Matrix4 proj, int wiewportWidth, int viewportHeight) |
| | | public static Vector2 WorldToScreen(Vector3 wp, Matrix4 model, Matrix4 view, Matrix4 proj, int wiewportWidth, int viewportHeight) |
| | | { |
| | | // 转换为齐次坐标 |
| | | var wph = new Vector4(wp, 1.0f); |
| | | //应用矩阵 |
| | | var mvp = mview * proj; |
| | | var mvp = model * view * proj; |
| | | //裁剪坐标 |
| | | var clip = Vector4.TransformRow(wph, mvp); |
| | | //NDC |
| | |
| | | /// </summary> |
| | | /// <param name="mouseX">屏幕坐标X(左上角为原点)</param> |
| | | /// <param name="mouseY">屏幕坐标Y(左上角为原点)</param> |
| | | /// <param name="depth">深度值(范围[0, 1],可选)</param> |
| | | /// <param name="forward">观察方向</param> |
| | | /// <param name="model">模型矩阵</param> |
| | | /// <param name="view">视图矩阵</param> |
| | | /// <param name="proj">投影矩阵</param> |
| | |
| | | ( |
| | | float mouseX, |
| | | float mouseY, |
| | | float depth, |
| | | Vector3 forward, |
| | | Matrix4 model, |
| | | Matrix4 view, |
| | | Matrix4 proj, |
| | |
| | | int viewportHeight |
| | | ) |
| | | { |
| | | var mview = view * model; |
| | | var origins = ScreenToWorld(mouseX, mouseY, depth, mview, proj, viewportWidth, viewportHeight); |
| | | return new Ray3(origins, forward); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 创建射线 |
| | | /// </summary> |
| | | /// <param name="mouseX">屏幕坐标X(左上角为原点)</param> |
| | | /// <param name="mouseY">屏幕坐标Y(左上角为原点)</param> |
| | | /// <param name="model">模型矩阵</param> |
| | | /// <param name="view">视图矩阵</param> |
| | | /// <param name="proj">投影矩阵</param> |
| | | /// <param name="viewportWidth">视口宽度</param> |
| | | /// <param name="viewportHeight">视口高度</param> |
| | | public static Ray3 CreateRay2 |
| | | ( |
| | | float mouseX, |
| | | float mouseY, |
| | | Matrix4 model, |
| | | Matrix4 view, |
| | | Matrix4 proj, |
| | | int viewportWidth, |
| | | int viewportHeight |
| | | ) |
| | | { |
| | | var mview = view * model; |
| | | var near = ScreenToWorld(mouseX, mouseY, 0f, mview, proj, viewportWidth, viewportHeight); |
| | | var far = ScreenToWorld(mouseX, mouseY, 1f, mview, proj, viewportWidth, viewportHeight); |
| | | var near = ScreenToWorld(mouseX, mouseY, 0f, model, view, proj, viewportWidth, viewportHeight); |
| | | var far = ScreenToWorld(mouseX, mouseY, 1f, model, view, proj, viewportWidth, viewportHeight); |
| | | var direction = (far - near).Normalized(); |
| | | return new Ray3(near, direction); |
| | | } |