2016-07-06 16 views
9

Ho Viewport3D nella finestra. cambierà la dimensione quando la dimensione della finestra cambierà.Come si calcola WPF tutte le impostazioni della telecamera in modo dinamico nel codice?

<Window> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="100"/> 
     <RowDefinition/> 
    <Grid.RowDefinitions> 
    <Label Grid.Row="0" Content="top label"/> 
    <Viewport3D Grid.Row="1" x:Name="vp3D" > 
      <Viewport3D.Camera > 
       <PerspectiveCamera x:Name="pCamera" LookDirection="0 0 -1" UpDirection="0 1 0" /> 
      </Viewport3D.Camera> 
      <Viewport2DVisual3D x:Name="v2dv3d"> 
        <Viewport2DVisual3D.Geometry> 
         <MeshGeometry3D x:Name="mg3d" TextureCoordinates="0,0 0,1 1,1 1,0" TriangleIndices="0 1 2 0 2 3"/> 
        </Viewport2DVisual3D.Geometry> 
        <Viewport2DVisual3D.Material> 
         <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/> 
        </Viewport2DVisual3D.Material> 

          <Image Height="{Binding ElementName=vp3D, Path=ActualHeight}" Width="{Binding ElementName=vp3D, Path=ActualWidth}" Stretch="Fill"/> 

      </Viewport2DVisual3D> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
         <DirectionalLight Color="#FFFFFFFF" Direction="0,0,-1"/> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
    </Viewport3D> 
</Grid> 
</Window 

Ora Voglio che l'immagine mostra sulla come se fosse la finestra 2D originale (simile non è cambiato nulla, ma in realtà l'immagine è 3d).

Ma il problema è Se voglio che abbia lo stesso aspetto dell'aspetto originale di WPF, devo modificare alcune impostazioni della Fotocamera, come PerspectiveCamera.Position o MeshGeometry3D.Position. poiché lo Viewport3D modifica dinamicamente la dimensione quando la finestra cambia dimensione, devo calcolare dinamicamente le impostazioni Viewport3D. C'è comunque da fare?

Ho già provato questo, ma non si può calcolare correttamente: WPF 3D: Fitting entire image to view with PerspectiveCamera

+2

Ho fatto del mio meglio e ho letto la tua domanda due volte, ma ancora non la capisco. Stai cercando di avere quell'immagine come sfondo dietro al Viewport? –

+1

@ MarkusHütter Fondamentalmente voglio che l'immagine sia mostrata come non c'è 'Viewport3D'. solo un 'Label' e' Image' nella 'Grid', e' Grid' potrebbe cambiare la dimensione con 'Window' – qakmak

risposta

1

L'ho finito da solo.

// get the Viewport3D size first, If you want to use .ActualWidth or .ActualHeight property get it, make sure your application loaded finish, otherwise it will return 0. 
double height = ; // get the Viewport3D height or calculate the height first 
double width = ; // get the Viewport3D width or calculate the width first 


mg3d.Positions.Clear(); 
mg3d.Positions.Add(new Point3D(-width, height, 0.0)); 
mg3d.Positions.Add(new Point3D(-width, -height, 0.0)); 
mg3d.Positions.Add(new Point3D(width, -height, 0.0)); 
mg3d.Positions.Add(new Point3D(width, height, 0.0)); 


double fieldOfViewInRadians = pCamera.FieldOfView * (Math.PI/180.0); 
var z = (width)/Math.Tan(0.5 * fieldOfViewInRadians); 
pCamera.Position = new Point3D(0.0, 0.0, z); 

È inoltre necessario assicurarsi di calcolarlo di nuovo se le dimensioni della finestra sono cambiate. Dopo di ciò, potresti fare qualsiasi animazione 3d che desideri.

4

non sono sicuro se questo è ciò che si vuole, ma hai provato questo?

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="100"/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <Label Grid.Row="0" Content="top label"/> 
    <Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1" Stretch="Fill"/> 
    <Viewport3D Grid.Row="1" x:Name="vp3D"> 
      <Viewport3D.Camera > 
       <PerspectiveCamera x:Name="pCamera" Position="0,0,1" LookDirection="0,0,-1" /> 
      </Viewport3D.Camera> 
      <Viewport2DVisual3D x:Name="v2dv3d"> 
        <Viewport2DVisual3D.Geometry> 
         <MeshGeometry3D x:Name="mg3d" Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0" TextureCoordinates="0,0 0,1 1,1 1,0" TriangleIndices="0 1 2 0 2 3"/> 
        </Viewport2DVisual3D.Geometry> 
        <Viewport2DVisual3D.Material> 
         <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/> 
        </Viewport2DVisual3D.Material> 
      </Viewport2DVisual3D> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
         <DirectionalLight Color="#FFFFFFFF" Direction="0,0,-1"/> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
     </Viewport3D> 
</Grid> 
+1

Mi dispiace, ho bisogno di' Immagine' in 'Viewport3D'. Perché ho bisogno di mostrare qualche animazione 3D più tardi. grazie. – qakmak

+0

hai provato il mio codice? L'immagine dovrebbe essere esattamente dietro il 'Viewport3D', quindi è ancora possibile mostrare i tuoi oggetti 3D di fronte ad esso. Se non è quello che vuoi fare ti esorto a migliorare la tua domanda! –

+4

non c'è bisogno di essere offeso, amico. Terrò questo post, quindi le persone come me, che cercano di aiutarti e non riescono a capire cosa vuoi, almeno sapranno cosa non vuoi. –

Problemi correlati