【问题标题】:Align 3d Object to Camera position将 3d 对象与相机位置对齐
【发布时间】:2015-08-21 08:08:19
【问题描述】:

我正在使用Viewport 控件在AB4D PowerToys 的帮助下可视化3d 工具模型。

目前我正在尝试将我的 3D 文本(即一组线条)与camera 对齐,因此它始终旋转到相机并看起来像 2D 文本。

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

【问题讨论】:

    标签: c# wpf 3d viewport modelvisual3d


    【解决方案1】:

    终于自己找到了答案:

    应在“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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2015-08-15
      • 2017-07-08
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多