lixiaojun
2025-03-28 bc99451a0ab10dbba6ac1fe4cea020d68bbbad2b
Yw.WinFrmUI.Hydro.L3d.Core/02-helper/06-transform/OrthoTransformHelper.cs
@@ -88,15 +88,16 @@
        /// <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);
@@ -108,17 +109,18 @@
        /// 世界坐标 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
@@ -131,8 +133,6 @@
        /// </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>
@@ -142,8 +142,6 @@
            (
                float mouseX,
                float mouseY,
                float depth,
                Vector3 forward,
                Matrix4 model,
                Matrix4 view,
                Matrix4 proj,
@@ -151,35 +149,8 @@
                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);
        }