Как переместить ось на 3d модель - PullRequest
0 голосов
/ 27 августа 2018

Несколько дней на 3D-модели, и я не могу понять, как переместить ось, чтобы я мог начать свои вращения.например .... Я хочу наклонить X на 30 градусов, и тогда я буду выстроен в линию, чтобы сделать каждую ось вращения.Если я поверну X на 30 градусов, это повлечет за собой вращения Y и Z.Любые примеры, как это сделать в коде позади?Самый близкий пример, который я нашел, был в демонстрации Манипулятора, но он не показывает код того, как работает манипулятор.

enter image description here

  private Transform3DGroup GetTransforms(Model3D model)
    {
        var transforms = new Transform3DGroup();
        // Rotation around X
        transforms.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 0)));
        // Rotation around Y 
        transforms.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 0)));
        // Rotation around Z
        transforms.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), 0)));
        // Translate transform (if required)
        transforms.Children.Add(new TranslateTransform3D());
        model.Transform = transforms;
        return transforms;
    }

 private void SetRotation(double amountX, double amountY, double amountZ, Model3D model, Point3D center)
    {
        // Suppose we have a function that gives us all the transforms
        // applied to this object
        var transforms = GetTransforms(model);
        var translation = transforms.Children[3];

        // Suppose GetCenter() obtains the center point of an object
        // in Point3D format
        var translatedCenter = translation.Transform(center);

        if (!(transforms.Children[0] is RotateTransform3D rotX)) throw new ArgumentNullException(nameof(rotX));
        if (!(transforms.Children[1] is RotateTransform3D rotY)) throw new ArgumentNullException(nameof(rotY));
        if (!(transforms.Children[2] is RotateTransform3D rotZ)) throw new ArgumentNullException(nameof(rotZ));

        // Set the center point of transformation to the translated center of the object
        rotX.CenterX = rotY.CenterX = rotZ.CenterX = translatedCenter.X;
        rotX.CenterY = rotY.CenterY = rotZ.CenterY = translatedCenter.Y;
        rotX.CenterZ = rotY.CenterZ = rotZ.CenterZ = translatedCenter.Z;

        // Apply the angle amounts
        ((AxisAngleRotation3D) rotX.Rotation).Angle = amountX;
        ((AxisAngleRotation3D) rotY.Rotation).Angle = amountY;
        ((AxisAngleRotation3D) rotZ.Rotation).Angle = amountZ;
    }
...