Windows上的wpf c#中的3D图形

时间:2012-11-06 05:26:43

标签: c# wpf

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

3 个答案:

答案 0 :(得分:1)

我认为你可以使用动画

一些伪代码:

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

答案 1 :(得分:0)

正确,“变换”操作不会转换网格的位置。相反,Transform属性定义渲染过程中网格的世界变换。

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

object space to world space diagram http://robertokoci.com/images/posts/graphics/game/programming/matrix-unveiled/ObjectWorldSpace.png

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

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

答案 2 :(得分:0)

你必须做角度+ = 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;