我是WPF中3D和动画的新手。我一直在尝试创建一个非常简单的场景,由一个地板和两个立方体组成(好吧,3D矩形,矩形棱镜,无论什么叫做)。这个场景有一个透视相机,我试图制作动画(我基本上希望它在场景中飞行)。
代码非常简单,我相信大部分时间都采用了很好的方法。请在下面找到相关摘录和sample project can be downloaded here。
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)
当窗口非常小(大约320x240)时,动画按预期运行。随着窗口大小的增加,动画闪烁,整个帧似乎被跳过,导致白屏。在一个大窗口(1920x1080)中,动画几乎完全不可见(在相机设置到新位置之前它们都是空白的。)
它似乎与this problem非常相似,但这对我没有帮助。
这是一个非常基本的动画,我无法相信WPF在这方面有任何问题,所以我认为我做错了。
任何人都可以帮我找出原因吗?我花了足够的时间在这上面。
提前致谢!
答案 0 :(得分:1)
您是否有单独的显卡或是否正在运行主板的视频输出?听起来你的显卡没有硬件加速。
如果你不这样做,你会得到你看到的效果。在小窗口尺寸下,软件渲染可以保持并以合理的帧速率显示场景。但是,当您增加窗口的大小时,显示每个帧所需的时间越来越长 - 直到显示时间大于您在场景中移动相机所花费的时间。它只会在你停止移动相机时赶上。
解决方案是坚持使用小窗口或获得可以实现3D图形硬件加速的图形卡。