Простая анимация камеры сильно мерцает

#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-графики.