WPF 3D - вращать модель вокруг своих осей - PullRequest
4 голосов
/ 11 января 2010

Предположим, у меня есть простая сцена WPF 3D, настроенная с одним прямоугольником, повернутым на -45 градусов вокруг оси X, например:

<Viewport3D>
    <Viewport3D.Camera>
        <PerspectiveCamera Position="0,0,4"/>
    </Viewport3D.Camera>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <DirectionalLight Color="White" Direction="-1,-1,-3" />
        </ModelVisual3D.Content>
    </ModelVisual3D>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <GeometryModel3D>
                <GeometryModel3D.Geometry>
                    <MeshGeometry3D Positions="-1,-1,0  1,-1,0  -1,1,0  1,1,0"
                                    TriangleIndices="0,1,2 1,3,2"/>
                </GeometryModel3D.Geometry>
                <GeometryModel3D.Material>
                    <DiffuseMaterial Brush="Red"/>
                </GeometryModel3D.Material>
            </GeometryModel3D>
        </ModelVisual3D.Content>
        <ModelVisual3D.Transform>
            <Transform3DGroup>
                <RotateTransform3D>
                    <RotateTransform3D.Rotation>
                        <AxisAngleRotation3D Axis="1,0,0" Angle="-45"/>
                    </RotateTransform3D.Rotation>
                </RotateTransform3D>
            </Transform3DGroup>
        </ModelVisual3D.Transform>
    </ModelVisual3D>
</Viewport3D>

Это дает мне следующее:

alt text

Теперь я хочу повернуть изображение на 45 градусов вокруг оси Z модели . Если я просто вставлю второй RotateTransform3D примерно так:

                <RotateTransform3D>
                    <RotateTransform3D.Rotation>
                        <AxisAngleRotation3D Axis="0,0,1" Angle="45"/>
                    </RotateTransform3D.Rotation>
                </RotateTransform3D>

Он вращается вокруг оси Z * сцены 1016 *. Для этого конкретного вращения X я разработал то, что мне нужно:

                <RotateTransform3D>
                    <RotateTransform3D.Rotation>
                        <AxisAngleRotation3D Axis="0,1,1" Angle="45"/>
                    </RotateTransform3D.Rotation>
                </RotateTransform3D>

Но здесь моя математика подводит меня. Может кто-нибудь сказать мне, как решить эту проблему для произвольного вращения X (и Y, если хотите)?

Ответы [ 2 ]

11 голосов
/ 13 января 2010

Хорошо, поговорил с другом математика, и он дал мне ответ:

так что я думаю, что вам нужно делать, если вы вращаетесь вокруг вектора (1,0,0) на угол «а» (т.е. вращение вокруг оси х, так что превращая ваш объект в плоскости y-z).

Дальнейшие вращения вокруг

x '- (1,0,0) остается прежним!

y '- (0, cosa, sina)

z '- (0, -sina, cosa)

аналогичный принцип будет действовать для повороты в плоскости x-z (0,1,0)

x '- (-sina, 0, cosa)

у '- (0,1,0) - тоже самое

z '- (sina, o, cosa)

и в плоскости x-y (0,0,1)

x '- (-sina, cosa, 0)

y '- (cosa, sina, 0)

z '- (0,0,1) остается прежним

TADA!

ОБНОВЛЕНИЕ: я создал функцию для вычисления матрицы, которая будет вращать объект по всем 3 осям. Это можно использовать с MatrixTransform3D.

    Matrix3D CalculateRotationMatrix(double x, double y, double z)
    {
        Matrix3D matrix = new Matrix3D();

        matrix.Rotate(new Quaternion(new Vector3D(1, 0, 0), x));
        matrix.Rotate(new Quaternion(new Vector3D(0, 1, 0) * matrix, y));
        matrix.Rotate(new Quaternion(new Vector3D(0, 0, 1) * matrix, z));

        return matrix;
    }
0 голосов
/ 16 января 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...