认识wpf的2种3D相机

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>  
  
  <Viewport3D>
            <Viewport3D.Camera>
                <OrthographicCamera Position="16,2,18" LookDirection="-1,0,-1" Width="10" />
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D Positions="-2,4,0 -2,0,0 -2,0,4 -2,4,4" TriangleIndices="0,1,2 0,2,3"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial Brush="Green"/>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D Positions="-2,4,4 -2,0,4 2,0,4 2,4,4" TriangleIndices="0,1,2 0,2,3"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial Brush="Blue"/>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D Positions="2,4,4 2,0,4 2,0,0 2,4,0" TriangleIndices="0,1,2 0,2,3"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial Brush="Red"/>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
            </ModelVisual3D>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <AmbientLight Color="Purple"  />
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
        
  </Grid>
</Page>

绘制正方体的三个面;正方体一个棱边朝向我们;先用正交相机看,看到如下,不符合我们日常视觉;没看到近大远小; 

 改用透视相机,

<Viewport3D.Camera>
<PerspectiveCamera Position="10,5,10" LookDirection="-2.5,-1,-2" />
 </Viewport3D.Camera>

看到如下,

 <MeshGeometry3D Positions="-2,4,0 -2,0,0 -2,0,4 -2,4,4" TriangleIndices="0,1,2 0,2,3"/>

"-2,4,0 -2,0,0 -2,0,4 -2,4,4",这是4个顶点;连接0、1、2做一个三角形,再连接0、2、3做一个三角形,两个三角形构成一个面;

WPF中实现3D UI并获取相机的视野,通常需要借助于WPF的`Viewport3D`控件和`ElementHost`控件来展示3D图形,并捕获其渲染结果为图片。这里是一个基本的步骤概述: 1. 创建一个`Viewport3D`,它作为容器来包含你的3D场景。 2. 在`Viewport3D`中添加模型、灯光和相机。 3. 使用`System.Windows.Media.Media3D`命名空间下的类来定义和操作3D对象。 4. 为了捕获图像,你可能需要使用`RenderTargetBitmap`,它允许你从`Visual`对象渲染图像。 5. 将`Viewport3D`的内容渲染到`RenderTargetBitmap`,然后保存为图片。 以下是实现上述步骤的代码示例: ```csharp using System.Windows; using System.Windows.Media; using System.Windows.Media.Media3D; using System.Windows.Media.Imaging; using System.Windows.Threading; // 创建3D内容 ModelVisual3D Create3DContent() { var model = new MeshGeometry3D(); // 添加模型的顶点和三角形索引... var material = new DiffuseMaterial(new SolidColorBrush(Colors.White)); var geometryModel = new GeometryModel3D(model, material); var model3DGroup = new Model3DGroup(); model3DGroup.Children.Add(geometryModel); var camera = new PerspectiveCamera { Position = new Point3D(0, 0, 5), LookDirection = new Vector3D(0, 0, -1), UpDirection = new Vector3D(0, 1, 0) }; var light = new AmbientLight(Colors.White); var visual3D = new ModelVisual3D { Content = new Model3DGroup { Children = { model3DGroup, light } }, Camera = camera }; return visual3D; } // 获取Viewport3D并渲染为图片 void CaptureViewportToFile(string filePath) { var visual3D = Create3DContent(); var viewport = new Viewport3D { Child = visual3D }; // 创建RenderTargetBitmap int width = 800; // 视口宽度 int height = 600; // 视口高度 var renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); // 使用Dispatcher定时器执行渲染 DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromMilliseconds(16); // 60fps timer.Tick += (sender, e) => { renderTargetBitmap.Render(viewport); timer.Stop(); // 保存图片 BitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); using (var fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Create)) { encoder.Save(fileStream); } }; timer.Start(); } // 使用方法 // CaptureViewportToFile("C:\\renderedImage.png"); ``` 请注意,上述代码只是一个框架示例,你需要根据实际的3D模型数据和场景来完善它。例如,你需要定义`MeshGeometry3D`的顶点和三角形索引以及可能的其他模型和材质。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值