WP3 и 3D, как вы заполняете Viewport3D VisualBrush? - PullRequest
2 голосов
/ 27 января 2011

У меня ОЧЕНЬ простое трехмерное пространство, определенное в WPF, которое определяет один трехмерный прямоугольник и трехмерную камеру. 3D Rect имеет Материал VisualBrush, который отображает содержимое окна. Он отлично работает (проекция хорошо заполняет доступную область), когда размер окна больше 960x550. НО, ниже этого числа (и до тех пор, пока ширина окна значительно меньше его высоты) он оставляет пустое пространство справа от экрана. Буду признателен за любые советы или указания ...

Вот мой XAML:

<Grid x:Name="RootGrid">
        <!--UI Stuff here-->
    </Grid>
    <Viewport3D x:Name="MyAnimatedObject" ClipToBounds="False">
        <Viewport3D.Camera>
            <PerspectiveCamera x:Name="myPerspectiveCamera" FieldOfView="60" Position="0,0,1"/>
        </Viewport3D.Camera>
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <DirectionalLight Color="#FFFFFF" Direction="-0.5,-0.5,-0.5"/>
            </ModelVisual3D.Content>
        </ModelVisual3D>
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <DirectionalLight Color="#FFFFFF" Direction="0.5,-0.5,-0.5"/>
            </ModelVisual3D.Content>
        </ModelVisual3D>
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <GeometryModel3D x:Name="geometryModel3D">
                    <GeometryModel3D.Transform>
                        <Transform3DGroup>
                            <TranslateTransform3D/>
                            <ScaleTransform3D/>
                            <RotateTransform3D/>
                            <TranslateTransform3D/>
                            <TranslateTransform3D/>
                        </Transform3DGroup>
                    </GeometryModel3D.Transform>
                    <GeometryModel3D.Geometry>
                        <MeshGeometry3D
       TriangleIndices="0 3 2 0 2 1"
       TextureCoordinates="0,0 1,0 1,1 0,1"
                            Normals="0,0,1 0,0,1 0,0,1 0,0,1"
       Positions="-1,-1,0 1,-1,0 1,1,0 1,1,0 -1,1,0 -1,-1,0"/>
                    </GeometryModel3D.Geometry>
                    <GeometryModel3D.Material>
                        <MaterialGroup>
                            <DiffuseMaterial>
                                <DiffuseMaterial.Brush>
                                    <VisualBrush Visual="{Binding ElementName=RootGrid}" Stretch="Fill"/>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                        </MaterialGroup>
                    </GeometryModel3D.Material>
                </GeometryModel3D>
            </ModelVisual3D.Content>
        </ModelVisual3D>
    </Viewport3D>

И код для динамического изменения размера 3D Rect здесь:

Private Sub MainWindow_SizeChanged(ByVal sender As Object, ByVal e As System.Windows.SizeChangedEventArgs) Handles Me.SizeChanged
    Dim AspectRatio As Double = RootGrid.ActualWidth / RootGrid.ActualHeight

    Dim CameraDistance As Double = AspectRatio / Math.Tan(30D * Math.PI / 180)
    myPerspectiveCamera.Position = New Media3D.Point3D(0, 0, CameraDistance)


    Dim points As New Media3D.Point3DCollection
    With points
        .Add(New Media3D.Point3D(0D - AspectRatio, 1, 0))
        .Add(New Media3D.Point3D(AspectRatio, 1, 0))
        .Add(New Media3D.Point3D(AspectRatio, -1, 0))
        .Add(New Media3D.Point3D(0D - AspectRatio, -1, 0))
    End With
    CType(geometryModel3D.Geometry, Media3D.MeshGeometry3D).Positions = points
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...