【问题标题】:Rotate and translate an object旋转和平移对象
【发布时间】:2016-01-19 07:13:27
【问题描述】:

我需要旋转和平移一个对象。我有一个问题,我只能做其中之一。我使用此代码:

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 属性,然后对其进行更改。所以当它被使用(通过视口)时,只有最后一个被使用。必须有一种方法可以组合转换对象或创建集合。
  • 是的,你是对的,谢谢!但是...任何想法如何改进? :)
  • 看了一眼,但没有看到任何明显的东西。就我个人而言,我可能会使用 Intellisense 并寻找看起来可能有帮助的类/方法,然后尝试它们

标签: c# rotation transform translation helix-3d-toolkit


【解决方案1】:

你必须直接弄乱Transform字段,而不是替换整个Transform,即transform.positiontransform.rotationtransform.localPositiontransform.localEulerAnglestransform.scaletransform.localScale等.

device3D2.Transform.rotation *= new Quaternion.AngleAxis(180f, new Vector3(0f, 0f, 1f));
device3D2.Transform.Translate(0, 0, 100);

【讨论】:

  • device3D2.Transform.rotation 我无法访问。
【解决方案2】:

您需要使用 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);

注意添加各个转换器的顺序。

【讨论】:

  • 如果有多个转换怎么办?或者,如果变换是由用户从键盘控制的,那么集合中将会有大量的对象
【解决方案3】:

我也在使用 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 实例上设置一个转换。这是另一个示例的链接:https://github.com/wolfoerster/WFTools3D/blob/50cc33f9f9929d4651d0855c386d38e6861382b2/WFTools3D/Basics/Object3D.cs#L142

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2020-11-12
    • 2013-09-27
    • 2013-05-23
    相关资源
    最近更新 更多