#wpf #animation #3d #flicker
#wpf #Анимация #3D #мерцание
Вопрос:
Я новичок в 3D и анимации в WPF. Я пытался создать очень простую сцену, состоящую из пола и двух кубов (ну, 3D-прямоугольников, прямоугольных призм, как бы это ни называлось). В этой сцене есть перспективная камера, которую я пытаюсь анимировать (я в основном хочу, чтобы она летала по сцене).
Код очень прост, и я считаю, что по большей части используется хороший подход. Пожалуйста, найдите соответствующие выдержки ниже, а пример проекта можно загрузить здесь.
XAML:
<Viewport3D ClipToBounds="false" IsHitTestVisible="false">
<!-- Camera -->
<Viewport3D.Camera>
<PerspectiveCamera x:Name="ViewportCamera"
Position="0 0 20"
LookDirection="40 40 0"
FarPlaneDistance="600"
UpDirection="0 0 1"
NearPlaneDistance="0.01"
FieldOfView="75" />
</Viewport3D.Camera>
<!-- Light -->
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Direction="1 0.5 1" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<!-- Floor -->
<local:CubeControl Color="Black" Size="300,300,1" Center="0,0,0" />
<local:CubeControl Color="LightGray" Size="15,25,40" Center="40,40,20" />
<local:CubeControl Color="LightGray" Size="25,20,60" Center="40,-40,30" />
</ModelVisual3D>
</Viewport3D>
VB:
Dim tAnimation As New Vector3DAnimation(ViewportCamera.LookDirection, New Vector3D(40, -40, -20), New Duration(TimeSpan.FromMilliseconds(1000)))
ViewportCamera.BeginAnimation(PerspectiveCamera.LookDirectionProperty, tAnimation)
Dim tAnimation2 As New Point3DAnimation(ViewportCamera.Position, New Point3D(-10, -10, 30), TimeSpan.FromMilliseconds(1000))
ViewportCamera.BeginAnimation(PerspectiveCamera.PositionProperty, tAnimation2)
Анимация выполняется, как и ожидалось, когда окно очень маленькое (около 320×240). По мере увеличения размера окна анимация начинает мерцать, и кажется, что целые кадры пропущены, в результате чего экран становится белым. В большом окне (1920х1080) анимация почти не видна вообще (она вся пустая, пока камера не будет установлена в новое положение).
Почему-то это кажется очень похожим на эту проблему, но мне это не помогло.
Это очень простая анимация, и я не могу поверить, что у WPF есть какие-либо проблемы с этим, поэтому я думаю, что делаю что-то неправильно.
кто-нибудь может помочь мне понять, почему? Я потратил на это более чем достаточно времени.
Заранее спасибо!
Комментарии:
1. Может ли кто-нибудь хотя бы попробовать мой пример проекта и сообщить мне, возникнет ли такая же проблема на их компьютере?
Ответ №1:
У вас есть отдельная видеокарта или вы отключаете видеовыход материнской платы? Похоже, у вас нет аппаратного ускорения на вашей видеокарте.
Если вы этого не сделаете, то получите эффект, который видите. При небольших размерах окна программный рендеринг может поддерживать и отображать сцену с разумной частотой кадров. Однако по мере увеличения размера окна для отображения каждого кадра требуется все больше и больше времени — пока время отображения не превысит время, необходимое для перемещения камеры по сцене. Это проявляется только тогда, когда вы прекращаете перемещать камеру.
Решение состоит в том, чтобы придерживаться небольших окон или приобрести видеокарту, которая выполняет аппаратное ускорение 3D-графики.