WPF: DropShadowEffect + Viewport2DVisual3D (Planerator/TiltEffect) вызывает деформацию/смещение во время «наклона».C#

Место общения программистов C#
Ответить
Anonymous
 WPF: DropShadowEffect + Viewport2DVisual3D (Planerator/TiltEffect) вызывает деформацию/смещение во время «наклона».

Сообщение Anonymous »

Я пытаюсь реализовать эффект «наклона» (небольшой трехмерный наклон элемента при нажатии или наведении курсора) в чистом WPF, аналогично UWP/WinUI. Я использую классический подход с Viewport2DVisual3D (Planerator Грега Шехтера). Однако, когда к визуальному элементу применен DropShadowEffect, содержимое выглядит визуально «деформированным»/смещенным относительно ожидаемого центра во время вращения.
Мне хотелось бы понять, как это правильно сделать в 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 можно увидеть смещение и «нечетный» перекос при повернут
(2 изображения: «before.png», «tilted.png»)
Изображение
Изображение


Минимальное воспроизведение
Сокращенный пример — кнопка в контейнере, к которой я применяю тень и наклон. Код наклона переключает прикрепленный 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);
Planerator (от Грега Шехтера) преобразует 2D в 3D и отлично работает в большинстве примеров. В моем случае я уже учел «нейтральные» границы, поскольку тень/обрезка могут сместить начало координат в отрицательные координаты:

Код: Выделить всё

// 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»