0

我是 3d Graphics 和 wpf 的新手,需要在我当前的项目中将这两者结合起来。我将点和法线添加到MeshGeometry3D并添加MeshGeometry3DGeometryModel3D. 然后添加GeometryModel3DModelVisual3D,最后添加ModelVisual3DViewPort3D. 现在,如果我需要旋转,我将在 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 对象中的坐标,这样当我下次进行转换时,它会在先前转换的模型而不是原始模型上进行。我如何获得这种行为?

4

3 回答 3

1

我认为你可以使用动画

一些伪代码:

角度 = 0 函数 onClick:新角度 = 角度 + 30 动画(角度,新角度)角度 = 新角度

于 2012-11-06T07:36:52.103 回答
0

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

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

对象空间到世界空间图

(图片来自World、View 和 Projection Matrix Unveiled

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

于 2012-11-06T08:19:05.197 回答
0

你必须做 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;
于 2013-03-04T14:59:39.390 回答