Как повернуть объект в C # 3D? - PullRequest
4 голосов
/ 18 ноября 2009

Мне нужно повернуть трехмерный объект-сетку по оси в C #.
Не могли бы вы показать мне, как это делается?

Ответы [ 5 ]

10 голосов
/ 18 ноября 2009

Умножить все вершины на матрицу вращения

alt text

2 голосов
/ 18 ноября 2009

Зависит от того, какой API вы хотите использовать:

В WPF вы можете сделать это так:

   <Viewport3D>
       <Viewport3D.Camera>
          <PerspectiveCamera Position="-40,40,40" LookDirection="40,-40,-40 " 
                             UpDirection="0,0,1" />
       </Viewport3D.Camera>
       <ModelVisual3D>
          <ModelVisual3D.Content>
             <Model3DGroup>
                <DirectionalLight Color="White" Direction="-1,-1,-3" />
                   <GeometryModel3D>
                   <Model3DGroup.Transform>
                      <RotateTransform3D>
                          <RotateTransform3D.Rotation>
                                <!-- here you do the rotation -->
                                <AxisAngleRotation3D x:Name="rotation" Axis="0 0 1" Angle="45" />
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                      </Model3DGroup.Transform>
                      <GeometryModel3D.Geometry>
                         <MeshGeometry3D Positions="0,0,0 10,0,0 10,10,0 0,10,0 0,0,10 
                            10,0,10 10,10,10 0,10,10"
                            TriangleIndices="0 1 3 1 2 3  0 4 3 4 7 3  4 6 7 4 5 6 
                                             0 4 1 1 4 5  1 2 6 6 5 1  2 3 7 7 6 2"/>
                      </GeometryModel3D.Geometry>
                      <GeometryModel3D.Material>
                         <DiffuseMaterial Brush="Red"/>
                      </GeometryModel3D.Material>
                   </GeometryModel3D>
                </Model3DGroup>
             </ModelVisual3D.Content>
          </ModelVisual3D>
    </Viewport3D>

Или в коде c #:

this.rotation.Angle = 90;

Если вы используете XNA, вы бы использовали что-то вроде Matrix.CreateRotationY и применили бы это к вашему ModelMesh экземпляру.

Конечно, есть множество сторонних движков и API, которые вы можете использовать. Интересным выбором может быть SlimDX , который представляет собой тонкую оболочку вокруг Direct3D, вроде Managed DirectX, когда-то был.

1 голос
/ 07 сентября 2011

У меня была похожая проблема. Я не уверен, что вы хотите повернуть, но давайте предположим, что вы хотите преобразовать MeshGeometry3D. Вот мое решение.

    public void RotateMesh(MeshGeometry3D mesh, Vector3D axis, double angle)
    {
        var transform = new RotateTransform3D(); 
        transform.Rotation = new AxisAngleRotation3D(axis, angle);

        for (int i = 0; i < mesh.Positions.Count; ++i) 
            mesh.Positions[i] = transform.Transform(mesh.Positions[i]);
    }
1 голос
/ 18 ноября 2009

Давайте добавим немного подробностей в это.

Учитывая спецификации для угла поворота и оси вращения, мы можем выполнить вращение за несколько шагов.

  1. Переведите объект так, чтобы ось вращения проходила через начало системы координат
  2. Повернуть объект так, чтобы ось вращения совпадала с одной из осей координат
  3. Выполнить указанное вращение вокруг выбранной координатной оси.
  4. Применить обратные повороты, чтобы вернуть ось вращения в исходное положение.
  5. Применить обратный перевод, чтобы вернуть ось вращения в исходное пространственное положение.

Код - это упражнение для читателя, так как для меня это тренировка мозга (компьютерная графика давно: d). Может быть, когда я это сделаю, я выложу немного больше.

Я полагаю, это было что-то вроде: R (тета) = Т ^ -1. Rx ^ -1 (альфа). Ry ^ -1 (бета). Rz (тета). Ry (бета). Rx (альфа). T

Где:

  • T = матрица перевода
  • Rx = вращение вокруг х и т. Д.

Тренировка мозга

О, мы можем упростить (даже без использования четвертей)

alt text
(источник: gamedev.net )

альтернативный текст http://www.gamedev.net/reference/articles/1199/image010.gif

и (x, y, z) - единичный вектор на оси вращения и угол поворота.

если я могу поверить, Google. Доказательство оставлено в качестве упражнения для читателя, но я считаю, что это правильно, насколько я могу видеть (источник: Graphics Gems (Glassner, Academic Press, 1990).)

0 голосов
/ 05 мая 2019

Вы можете использовать Skiasharp , библиотека с открытым исходным кодом

Проверьте этот код , как это сделать.

...