C# 旋转和平移对象
我需要旋转和平移一个对象。我有一个问题,我只能做其中一个。我使用以下代码:C# 旋转和平移对象,c#,rotation,transform,translation,helix-3d-toolkit,C#,Rotation,Transform,Translation,Helix 3d Toolkit,我需要旋转和平移一个对象。我有一个问题,我只能做其中一个。我使用以下代码: RotateTransform3D myRotate = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), Convert.ToDouble(180)), new Point3D(0, 0, 0)); TranslateTransform3D myTranslate = new TranslateTransform3D(0, 0, 1
RotateTransform3D myRotate = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), Convert.ToDouble(180)), new Point3D(0, 0, 0));
TranslateTransform3D myTranslate = new TranslateTransform3D(0, 0, 100);
ModelVisual3D device3D2 = new ModelVisual3D();
device3D2.Content = Display3d(MODEL_PATH2);
device3D2.Transform = myRotate;
device3D2.Transform = myTranslate;
viewPort3d.Children.Add(device3D2);
问题是它只执行最后一次变换。我的意思是,如果我应用第二个“myRotate”,它会旋转对象,但不会应用“myTranslate”操作。我需要做两个变换
我也在使用HelixToolkit。您必须直接处理
变换
字段,而不是替换整个变换
,即变换.位置
,变换.旋转
,变换.局部位置
,变换.局部可缩放
,transform.localScale
等
device3D2.Transform.rotation *= new Quaternion.AngleAxis(180f, new Vector3(0f, 0f, 1f));
device3D2.Transform.Translate(0, 0, 100);
您需要使用Transform3DGroup对象。然后将不同的转换添加到其中:
Transform3DGroup myTransformer = new Transform3DGroup;
RotateTransform3D myRotate = new RotateTransform3D(new AxisAngleRotation3D (new Vector3D(0, 0, 1), Convert.ToDouble(180)), new Point3D(0, 0, 0));
TranslateTransform3D myTranslate = new TranslateTransform3D(0, 0, 100);
myTransformer.Children.Add(myRotate);
myTransformer.Children.Add(myTranslate);
ModelVisual3D device3D2 = new ModelVisual3D();
device3D2.Content = Display3d(MODEL_PATH2);
device3D2.Transform = myTransformer;
viewPort3d.Children.Add(device3D2);
注意添加单个变压器的顺序 我也在使用HelixToolkit 在这里,我创建模型并在场景中进行转换:
ModelVisual3D mdl = new ModelVisual3D();
mdl.Content = getModel3D();
if ((thecurrentBox.upperLeft.X != 0)||(thecurrentBox.bottomRight.Y!=0)) {
Matrix3D mm = mdl.Transform.Value;
mm.Translate(new Vector3D(-thecurrentBox.upperLeft.X, 0, -thecurrentBox.bottomRight.Y));
// you can do even more transformations here.
//you can make mm as private field and transform it whenever you like
mdl.Transform = new MatrixTransform3D(mm);
}
// add mdl to Children of scene
我得到变换矩阵的当前值,对其进行运算,然后在ModelVisual3D实例上设置变换。下面是另一个示例的链接:我对该框架一无所知,但很明显,问题是您正在设置
Transform
属性,然后对其进行更改。因此,当它被使用时(通过视口),只有最后一个被使用。必须有一种方法来组合变换对象或创建集合。是的,您是正确的,谢谢!但是有什么办法可以改进吗?:)快速看了一眼,但看不到任何明显的东西。就我个人而言,我可能会使用Intellisense,寻找看起来可能有用的类/方法,然后尝试它们。如果有多个转换呢?或者,如果用户通过键盘控制变换,则collectiondevice3D2中会有大量对象。我无法访问transform.rotation。