我是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对象中的坐标,这样当我下次对先前转换的模型进行转换时,而不是原始模型。我如何获得这种行为?
答案 0 :(得分:1)
我认为你可以使用动画
一些伪代码:
角度= 0 函数onClick: new_angle = angle + 30 动画(角度,new_angle) angle = new_angle
答案 1 :(得分:0)
正确,“变换”操作不会转换网格的位置。相反,Transform属性定义渲染过程中网格的世界变换。
在3d图形中,世界变换在渲染对象期间将网格的点从对象空间转换为世界空间。
(图片来自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;