2016-07-06 8 views
9

私はウィンドウ内にViewport3Dを持っています。ウィンドウサイズが変更されたときにサイズが変更されます。コード内で動的にすべてのカメラ設定をWPFで計算するにはどうすればよいですか?

<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 

私はそれが元の2Dウィンドウ(変更何のように見えるが、実際に画像が3Dである)だと同様に画像が上を示してほしいです。

しかし、問題はWPFオリジナルと同じように見たい場合は、PerspectiveCamera.PositionまたはMeshGeometry3D.Positionのようなカメラの設定を変更する必要があります。 Viewport3Dは、ウィンドウのサイズが変更されたときにサイズを動的に変更するので、動的にViewport3Dの設定を計算する必要があります。とにかくやりたいことはありますか?

私はすでにこれを試してみたが、正確に計算することができません。 WPF 3D: Fitting entire image to view with PerspectiveCamera

+2

私はベストを尽くし、あなたの質問を2回読んだが、それでも理解できない。 Viewportの背後にある背景のようなイメージを持っていますか? –

+1

@MarkusHütter基本的には 'Viewport3D'がないような' Image'ショーが必要です。 'Grid'には' Label'と 'Image'だけがあり、' Grid'は 'Window'でサイズを変えることができます – qakmak

答えて

1

自分で仕上げます。

// 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); 

また、ウィンドウサイズが変更された場合は、再度計算する必要があります。その後、必要な3Dアニメーションを行うことができます。

4

私はそれはあなたが望むものであるかどうかわからないんだけど、あなたはこれを試してみましたか?

<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

申し訳ありません、' Viewport3D'に 'Image'が必要です。あとで3Dアニメーションを表示する必要があるからです。ありがとうございました。 – qakmak

+0

私のコードを試しましたか? Imageは 'Viewport3D'の直後にあるはずですから、3Dのものを表示することもできます。それがあなたがしたいことではない場合、私はあなたの質問を改善することを強くお勧めします! –

+4

怒ってもらう必要はありません。私はこの投稿を残しておきますので、私のような人はあなたを助けようとしていて、あなたが望んでいないものは少なくともあなたが望んでいないものを少なくとも知っています。 –

関連する問題