2012-11-06 16 views
0

我是新的3D图形,也是WPF,需要结合这两个在我目前的项目。我给MeshGeometry3D添加积分和法线,并将MeshGeometry3D加到GeometryModel3D。然后加GeometryModel3DModelVisual3D,最后加ModelVisual3DViewPort3D。现在,如果我需要旋转,我在GeometryModel3D或ModelVisual3D上执行所需的变换,并最终再次将其添加到ViewPort3D。我运行到一个问题:在Windows上的3D图形在WPF的C#

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

为什么我必须做angle += 15并不仅仅是15每次15度旋转呢?看起来存储的模型未被Transform操作转换,但转换仅在通过ViewPort3D显示时应用。我想要转换实际上改变存储的MeshGeometry3D对象中的坐标,以便当我在下一次执行转换时对先前转换的模型执行转换,而不是原始模型。我如何获得这种行为?

回答

1

我想你可以使用动画

一些伪代码:

角度= 0 功能的onClick: new_angle =角+ 30 动画(角度,new_angle) 角= new_angle

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

这将大大加快设置场景变换,让渲染绘制网格在一个单一的变换不是改造网格的每个顶点,就像你想要的。

+0

感谢。但是我的要求是,一旦呈现,用户可以选择网格模型中的一个或多个顶点并拖动鼠标。在这种情况下,我需要相应地变形渲染模型并再次渲染。你会建议什么? – user1790875

+0

那么你可以做相反的事情。采取用户点击的点,并进行逆变换以映射回对象空间。 –

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;