Простая анимация камеры имеет много мерцания - PullRequest
2 голосов
/ 23 мая 2011

Я новичок в 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). При увеличении размера окна анимация мерцает, и кажется, что целые кадры пропускаются, в результате чего появляется белый экран. В большом окне (1920x1080) анимация практически не видна (все остается пустым, пока камера не будет установлена ​​в новое положение).

Почему-то это похоже на эту проблему , но это не помогло мне.

Это очень простая анимация, и я не могу поверить, что у WPF есть какие-либо проблемы с этим, поэтому я думаю, что делаю что-то не так.

Может кто-нибудь помочь мне понять, почему? Я потратил на это более чем достаточно времени.

Заранее спасибо!

1 Ответ

1 голос
/ 27 января 2012

У вас есть отдельная видеокарта или вы используете видео выход материнской платы?Похоже, у вас нет аппаратного ускорения на вашей видеокарте.

Если нет, то вы получите эффект, который видите.При небольших размерах окна программный рендеринг может поддерживать и отображать сцену с разумной частотой кадров.Однако при увеличении размера окна отображение каждого кадра занимает больше и больше времени, пока время отображения не станет больше, чем время, необходимое для перемещения камеры по сцене.Он срабатывает только при прекращении движения камеры.

Решение состоит в том, чтобы придерживаться небольших окон или получить видеокарту с аппаратным ускорением 3D-графики.

...