c# WPF 3D hitTest错误:不支持单数MatrixCamera

本文关键字:不支持 单数 MatrixCamera 错误 WPF 3D hitTest | 更新日期: 2023-09-27 18:06:42

这是我用来做hitTest的代码:

RayHitTestResult hit = VisualTreeHelper.HitTest(
      App.MainWin.Viewport, location) as RayHitTestResult;

此代码适用于相机宽度较小(即对象较大)的情况。当我缩小相机(即对象变小)到某一点时,然后当我点击视口时,它会在上面的代码中显示一个错误,错误细节如下:

系统。未处理NotSupportedException: Hit testing with a不支持单数MatrixCamera

我搜索了一下,发现没有人有这个错误。知道怎么解吗?谢谢!

我用来创建/更新MatrixCamera的代码:(他们的灵感来自于Charles Petzold的《3D Programming for Windows: three - d Graphics Programming for The Windows Presentation Foundation》第7章中的例子)

    //create a new camera, initialize it and attach it to the viewport.
    public void initCamera(Point3D position, Point3D AimPoint, 
                           Vector3D upDirection, double farDistance, 
                           double nearDistance, double Width)
    {
        this._Camera = new MatrixCamera();
        this.CameraAimPoint = (Vector3D)AimPoint;
        //check and adjust the camera depth if needed
        this.CameraZAxis = Point3D.Subtract(position, AimPoint); 
        this.CameraDepth = CameraZAxis.Length;
        this.CameraZAxis.Normalize();
        this.CameraPosition = this.CameraAimPoint + (this.CameraZAxis *  this.CameraDepth);
        this.CameraFarDistance = farDistance;
        this.CameraNearDistance = nearDistance;
        this.CameraWidth = Width;
        this.CameraXAxis = Vector3D.CrossProduct(upDirection, this.CameraZAxis);
        this.CameraXAxis.Normalize();
        this.CameraYAxis = Vector3D.CrossProduct(this.CameraZAxis, this.CameraXAxis);
        this._CameraViewMatrix = new Matrix3D();
        this._CameraViewMatrix.M14 = 0;
        this._CameraViewMatrix.M24 = 0;
        this._CameraViewMatrix.M34 = 0;
        this._CameraViewMatrix.M44 = 1;
        this.updateViewMatrix();
        this._CameraProjectMatrix = new Matrix3D();
        this._CameraProjectMatrix.M14 = 0;
        this._CameraProjectMatrix.M24 = 0;
        this._CameraProjectMatrix.M34 = 0;
        this._CameraProjectMatrix.M44 = 1;
        this.updateProjectionMatrix();
        this._Viewport.Camera = this._Camera;
    }
    private void updateViewMatrix(bool axisChanged=true)
    {
        if (axisChanged==true)
        {
            this._CameraViewMatrix.M11 = this.CameraXAxis.X;
            this._CameraViewMatrix.M12 = this.CameraYAxis.X;
            this._CameraViewMatrix.M13 = this.CameraZAxis.X;
            this._CameraViewMatrix.M21 = this.CameraXAxis.Y;
            this._CameraViewMatrix.M22 = this.CameraYAxis.Y;
            this._CameraViewMatrix.M23 = this.CameraZAxis.Y;
            this._CameraViewMatrix.M31 = this.CameraXAxis.Z;
            this._CameraViewMatrix.M32 = this.CameraYAxis.Z;
            this._CameraViewMatrix.M33 = this.CameraZAxis.Z;
        }
        this._CameraViewMatrix.OffsetX = -Vector3D.DotProduct(this.CameraXAxis, this.CameraPosition);
        this._CameraViewMatrix.OffsetY = -Vector3D.DotProduct(this.CameraYAxis, this.CameraPosition);
        this._CameraViewMatrix.OffsetZ = -Vector3D.DotProduct(this.CameraZAxis, this.CameraPosition);
        this._Camera.ViewMatrix = this._CameraViewMatrix;
        this._3DTo2DTransformMatrixIsDefined = false;
        AfterDraw();
    }
    //
    private void updateProjectionMatrix() {
        double ScaleX = 2 / CameraWidth;
        double ScaleY = _Viewport.ActualWidth / _Viewport.ActualHeight * ScaleX;
        double ScaleZ = 1 / (CameraNearDistance - CameraFarDistance);
        double zOffset = CameraNearDistance * ScaleZ;
        _CameraProjectMatrix.M11 = ScaleX;
        _CameraProjectMatrix.M22 = ScaleY;
        _CameraProjectMatrix.M33 = ScaleZ;
        _CameraProjectMatrix.OffsetZ = zOffset;
        _Camera.ProjectionMatrix = _CameraProjectMatrix;
        _3DTo2DTransformMatrixIsDefined = false;
        _PixelToWorldUnit = CameraWidth / _Viewport.ActualWidth;
        AfterDraw();
    }

执行相机缩放的代码:

    private void _cameraZoomToScale(double width)
    {
        if (width< 1) width = 1;
        this.CameraWidth = width;
        updateProjectionMatrix();
    }

c# WPF 3D hitTest错误:不支持单数MatrixCamera

这似乎很清楚,你是变焦进一步比MatrixCamera支持。弄清楚这个异常发生在什么缩放级别,并防止用户看到那么远。它看起来像你可能已经试图这样做,已经与if (scale < 1) scale = 1;,但scale似乎没有在张贴代码的其他地方使用。