Мне хотелось бы понять, как это правильно сделать в WPF — либо как использовать DropShadow, чтобы наклон работал без деформации, либо как правильно вычислить границы/камеру, либо как отделить тень.
Среда
- WPF (.NET 6/7/8), Windows 10/11
- Эффект: пользовательский TiltEffect (при нажатии или наведении курсора мыши оборачивает элемент в Planerator и анимирует RotationX/RotationY/Depth)
- 3D-отображение: Viewport2DVisual3D (Planerator)
- Элементы имеют прозрачный фон; тень создается через DropShadowEffect (или эквивалентную размытую тень)
- Если я применю DropShadowEffect непосредственно к элементу, отображенному в 3D (это Viewport2DVisual3D.Visual), WPF сначала преобразует элемент в внеэкранная текстура с расширенными границами размытия/тени и только затем проецируется в 3D.
- При этом изменяется «оптический» размер и смещение относительно RenderSize. В результате при вращении/наклоне центр смещается и все это выглядит как деформация/смещение контента.
- [до наклона] — контент без вращения (как и ожидалось)
- [во время наклона] — с помощью DropShadowEffect можно увидеть смещение и «нечетный» перекос при повернут


Минимальное воспроизведение
Сокращенный пример — кнопка в контейнере, к которой я применяю тень и наклон. Код наклона переключает прикрепленный IsPressed; Planerator проецирует все в 3D.
Код: Выделить всё
Код: Выделить всё
Код: Выделить всё
// The events only toggle IsPressed; TiltEffect then sets PlaceIn3D=true internally and animates the rotations
private void OnDown(object sender, MouseButtonEventArgs e) => TiltEffect.SetIsPressed((FrameworkElement)sender, true);
private void OnUp(object sender, RoutedEventArgs e) => TiltEffect.SetIsPressed((FrameworkElement)sender, false);
Код: Выделить всё
// key part: Update3D in the Planerator
private void Update3D()
{
if (_logicalChild == null) return;
Rect bounds = VisualTreeHelper.GetDescendantBounds(_logicalChild);
double w = _logicalChild.RenderSize.Width;
double h = _logicalChild.RenderSize.Height;
if (w
Подробнее здесь: [url]https://stackoverflow.com/questions/79810733/wpf-dropshadoweffect-viewport2dvisual3d-planerator-tilteffect-causes-deform[/url]
Мобильная версия