Предположим, у меня есть простая сцена 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>
Это дает мне следующее:
Теперь я хочу повернуть изображение на 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, если хотите)?