Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 旋转和平移对象_C#_Rotation_Transform_Translation_Helix 3d Toolkit - Fatal编程技术网

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。