Phan7om Ответов: 3

Поворот 3D-преобразований в wpf


Всем Привет

Недавно я начал разработку WPF/C# 3D. Я пытаюсь повернуть прямоугольник. Но проблема в том, что когда я вращаю его, другие оси также вращаются.

Например, если я поверну его вдоль оси x на 90, оси y и z также будут повернуты. то есть ось y направлена к отрицательной оси z, а ось z-к оси Y. Теперь, если я хочу повернуть его вокруг оси y, я должен повернуть его на самом деле вокруг оси z, только тогда он будет вращаться вокруг y в пользовательском интерфейсе.

Я предполагаю, что мне нужно следить за каждой осью, если я ничего не упускаю. Кто-нибудь может мне помочь ?

Я изучал кватернионы, но даже тогда мне приходилось следить за осями.

это код, который я использую

public void RotateXAxis(RotateDirection rotaryDirection)
        {
            AxisAngleRotation3D axisAngleRotation = new AxisAngleRotation3D(new Vector3D(1,0,0), 90 * x * (int)rotaryDirection);
            RotateTransform3D rotation = new RotateTransform3D(axisAngleRotation, new Point3D(7.5, 7.5, 7.5));
            this.modelVisual3D.Transform = rotation;
         
        }

        /// <summary>
        /// Rotates the slice arount Y-Axis
        /// </summary>
        /// <param name="rotaryDirection"></param>
        public void RotateYAxis(RotateDirection rotaryDirection)
        {
            AxisAngleRotation3D axisAngleRotation = new AxisAngleRotation3D(new Vector3D(0, 1, 0), -90 * y * (int)rotaryDirection);
            RotateTransform3D rotation = new RotateTransform3D(axisAngleRotation, new Point3D(7.5, 7.5, 7.5));

            this.modelVisual3D.Transform = rotation;

        }


С уважением,
Заин-уль-abideen

3 Ответов

Рейтинг:
1

charles922

Заин-уль-abideen

Пример кода см. В разделе "Как применить несколько преобразований к трехмерной модели".

https://docs.microsoft.com/en-us/dotnet/framework/wpf/graphics-multimedia/how-to-apply-multiple-transformations-to-a-3-d-model


CHill60

Вы уже ответили на этот пост более 3 лет назад - Знаете ли вы, что можете использовать ссылку "улучшить решение", чтобы добавить дополнительную информацию в свой пост. Лучше сделать это, чем добавлять второе решение, так как это может сбить читателей с толку относительно того, какое из них должно быть фактическим решением

Рейтинг:
0

ge-force

Интересный. Это может быть несколько вещей. :-)

Один.

Где-то в вашем коде вы используете это значение поворота и вставляете его куда-то. Но место, где вы его используете, может нуждаться в другом формате, чем то, что вы вставляете (например, вы можете вставлять свои значения не в то место).

Б.

Это может быть ошибка в WPF. Есть небольшие ошибки, подобные этой, разбросанные по всему C# (например, при использовании цикла foreach вы не можете изменить значения, потому что это приведет к сбою программы). Поэтому вы можете погуглить это и посмотреть, является ли это хорошо известной проблемой.

С.

Может быть, вы используете неправильную технику вращения (без обид). Проверьте на MSDN (http://www.msdn.microsoft.com/),
и посмотрите в библиотеке, в системе.Раздел Windows (http://msdn.microsoft.com/en-us/library/gg145013.aspx), и поиск по классам, чтобы увидеть, есть ли более подходящий способ сделать 3D-вращение.

Надеюсь, это поможет.

:-)


Рейтинг:
0

charles922

В мире OpenGL и DirectX вы "нажимаете" матрицу представления модели, затем выполняете преобразование (перевод и/или вращение), а затем "всплываете" матрицу. В оригинальном руководстве по программированию OpenGL в главе 3 был отличный пример того, как Земля вращается вокруг Солнца, демонстрируя толчки и хлопки с вращением и трансформацией между ними. (Выполните поиск "планетарной" или "Солнечной системы" для аналогичных проектов OpenGL или DirectX в C#.)

Однако я уже некоторое время борюсь, пытаясь добиться того же самого с помощью WPF/C# 3D. Если я когда-нибудь выясню, как "толкать" и "всплывать" матрицу представления модели в WPF, я опубликую код.

Стоит повторить, что матричное умножение не является коммутативным, поэтому порядок, в котором вы переводите и вращаете, имеет решающее значение.