【问题标题】:3D graphics in wpf c# on windowswindows上wpf c#中的3D图形
【发布时间】:2019-08-26 23:29:10
【问题描述】:

我是 3d Graphics 和 wpf 的新手,需要在我当前的项目中将这两者结合起来。我将点和法线添加到MeshGeometry3D 并将MeshGeometry3D 添加到GeometryModel3D。然后将GeometryModel3D 添加到ModelVisual3D,最后将ModelVisual3D 添加到ViewPort3D。现在,如果我需要旋转,我将在 GeometryModel3D 或 ModelVisual3D 上执行所需的变换,并最终将其再次添加到 ViewPort3D。我遇到了问题:

objViewPort3D.Remove(objModelVisual3D);
objGeometryModel3D.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), angle += 15));
objModelVisual3D.Content = objGeometryModel3D;
objViewPort3D.Children.Add(objModelVisual3D);

每次将其旋转 15 度,为什么我必须使用 angle += 15 而不仅仅是 15?似乎存储的模型没有被Transform 操作转换,但只有在ViewPort3D 显示时才应用转换。我希望转换能够实际更改存储的 MeshGeometry3D 对象中的坐标,这样当我下次进行转换时,它会在先前转换的模型而不是原始模型上进行。我如何获得这种行为?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    我认为你可以使用动画

    一些伪代码:

    角度 = 0 点击功能: 新角度 = 角度 + 30 动画(角度,新角度) 角度 = 新角度

    【讨论】:

      【解决方案2】:

      您必须使用 angle += 15,因为您每次都在应用新的 RotateTransform3D。

      这可能会有所帮助:

      public RotateTransform3D MyRotationTransform { get; set; }
      ...
      //constructor
      public MyClass()
      {
           MyRotationTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 0));
      
      }
      
      //in your method
      MyRotationTransform.Rotation += 15;
      objGeometryModel3D.Transform = MyRotationTransform;
      

      【讨论】:

        【解决方案3】:

        正确,网格的位置没有被“变换”操作变换。相反,Transform 属性定义了渲染期间网格的世界变换。

        在 3d 图形中,世界变换在对象渲染期间将网格的点从对象空间转换到世界空间。

        (图片来自World, View and Projection Matrix Unveiled

        设置世界变换并让渲染器在单个变换中绘制网格比像你想要的那样变换网格的每个顶点要快得多。

        【讨论】:

        • 谢谢。但是我的要求是,一旦渲染,用户可以在网格模型中选择一个或多个顶点并拖动鼠标。在这种情况下,我需要相应地对渲染模型进行变形并再次渲染。你有什么建议?
        • 你可以反过来。获取用户单击的点,然后进行逆变换以映射回对象空间。
        猜你喜欢
        • 1970-01-01
        • 2016-08-09
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2023-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多