Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将三维对象与摄影机位置对齐_C#_Wpf_3d_Viewport_Modelvisual3d - Fatal编程技术网

C# 将三维对象与摄影机位置对齐

C# 将三维对象与摄影机位置对齐,c#,wpf,3d,viewport,modelvisual3d,C#,Wpf,3d,Viewport,Modelvisual3d,我正在使用视口控件在的帮助下可视化三维工具模型 目前,我正在尝试将我的3D文本(一组线)与相机对齐,因此它总是向相机旋转,看起来像2D文本 是否可以将我的视觉转换绑定到相机的位置?最终我自己找到了答案: 应在“CameraChanged”事件中调用以下代码 private void UpdateTransforms() { if (!this.IsAttachedToViewport3D()) { return; }

我正在使用
视口
控件在的帮助下可视化三维工具模型

目前,我正在尝试将我的3D文本(一组线)与
相机对齐,因此它总是向相机旋转,看起来像2D文本


是否可以将我的视觉转换绑定到相机的位置?

最终我自己找到了答案:

应在“CameraChanged”事件中调用以下代码

private void UpdateTransforms()
    {
        if (!this.IsAttachedToViewport3D())
        {
            return;
        }

        Matrix3D view, projection;
        if (Camera.GetCameraMatrixes(out view, out projection))
        {
            Vector3D up = new Vector3D(view.M12, view.M22, view.M32);
            Vector3D look = new Vector3D(view.M13, view.M23, view.M33);

            Transform3D transform = Transform;
            Matrix3D inverseWorld = this.GetTransform();
            inverseWorld.Invert();

            look = inverseWorld.Transform(look);
            look.Normalize();

            up = inverseWorld.Transform(up);
            up.Normalize();

            Quaternion q = LookAtRotation(look, up);

            Transform3DGroup grp = new Transform3DGroup();
            grp.Children.Add(new RotateTransform3D(new QuaternionRotation3D(q), CenterPosition));
            grp.Children.Add(transform);
            Transform = grp;

            Camera.Refresh();
        }
    }

    private static Quaternion LookAtRotation(Vector3D lookAt, Vector3D upDirection)
    {
        Vector3D forward = lookAt;
        Vector3D up = upDirection;

        // Orthonormalize
        forward.Normalize();
        up -= forward * Vector3D.DotProduct(up, forward);
        up.Normalize();

        Vector3D right = Vector3D.CrossProduct(up, forward);

        Quaternion q = new Quaternion
        {
            W = Math.Sqrt(1.0 + right.X + up.Y + forward.Z) * 0.5
        };

        double w4Recip = 1.0 / (4.0 * q.W);
        q.X = (up.Z - forward.Y) * w4Recip;
        q.Y = (forward.X - right.Z) * w4Recip;
        q.Z = (right.Y - up.X) * w4Recip;

        return q;
    }