【发布时间】:2015-01-02 19:34:21
【问题描述】:
我有一个可以旋转图像的 viewport3D。我必须在后面的代码中构建它。如果我将视口放在网格中,一切正常。但是如果我尝试使用 RenderTargetBitmap 渲染它,就会出现一些问题,我总是得到一个空图像。
这是我的代码:
Viewport3D vp = new Viewport3D();
PerspectiveCamera came = new PerspectiveCamera();
came.Position = new Point3D(0,0,4);
vp.Camera = came;
ModelVisual3D light = new ModelVisual3D();
AmbientLight ambLight = new AmbientLight(Colors.White);
light.Content = ambLight;
vp.Children.Add(light);
Viewport2DVisual3D v2d = new Viewport2DVisual3D();
MeshGeometry3D geom3d = new MeshGeometry3D();
geom3d.Positions = new Point3DCollection() {new Point3D(-1,1,0), new Point3D(-1,-1,0), new Point3D(1,-1,0), new Point3D(1,1,0)};
geom3d.TextureCoordinates = new PointCollection(){new Point(0,0), new Point(0,1), new Point(1,1), new Point(1,0)};
geom3d.TriangleIndices = new Int32Collection(){0,1,2,0,2,3};
v2d.Geometry=geom3d;
DiffuseMaterial mat = new DiffuseMaterial(new SolidColorBrush(Colors.Black));
Viewport2DVisual3D.SetIsVisualHostMaterial(mat, true);
v2d.Material = mat;
v2d.Transform = new RotateTransform3D( new AxisAngleRotation3D( new Vector3D(0, 1, 0), 45));
Image img = new Image();
BitmapImage bmpRend = new BitmapImage();
bmpRend.BeginInit();
bmpRend.UriSource = new Uri(@"/WpfProva;component/Images/06_09_2012_09_57_46.jpg", UriKind.Relative);
bmpRend.EndInit();
img.Source = bmpRend; //cam.CAM1_Image_act;
img.Width=200;
img.Height=200;
//Button btn = new Button();
//btn.Content = "Bottone 3D";
//btn.Width = 50;
//btn.Height = 50;
v2d.Visual = img;
vp.Children.Add(v2d);
//grdContainer.Children.Add(vp);
int wd = 500; //(int)vp.ActualWidth;
int ht = 500; //(int)vp.ActualHeight;
vp.Width = wd;
vp.Height = ht;
vp.Measure(new Size(wd, ht));
vp.Arrange(new Rect(0, 0, wd, ht));
//Viewbox viewbox = new Viewbox();
//viewbox.Child = vp; //control to render
//viewbox.Measure(new System.Windows.Size(wd/20, ht/20));
//viewbox.Arrange(new Rect(0, 0, wd/5, ht/5));
//viewbox.UpdateLayout();
RenderTargetBitmap bmpRender = new RenderTargetBitmap(wd, ht, 300, 300, PixelFormats.Pbgra32);
bmpRender.Render(vp);
using (FileStream outStream = new FileStream(@"C:\mycanvas.png", FileMode.Create))
{
PngBitmapEncoder enc = new PngBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bmpRender));
enc.Save(outStream);
}
我在 InitializeComponent() 之后调用了这个函数。
【问题讨论】:
-
您是否尝试在 xaml 中复制相同的内容?您看到的是预期还是空白?
-
是的,我尝试在 Xaml 中复制,我看到了预期的结果;只有后面的代码我得到空图像
-
您是否可以发布演示该问题的 xaml 或完整的工作示例?
-
xaml 很简单,只是 VS2013 使用“Add->New Window”命令生成的一个空窗口(它只包含一个空的 Grid 标签)。在后面的代码中只有 InitializeComponents() 调用和我发布的对此代码的调用。没有其他函数。您可以在任何空的示例项目中尝试它。显然是在项目的资源中添加图片。
标签: c# wpf rendertargetbitmap viewport3d