Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实时绘制WPF的三维模型_C#_3d_Paintevent - Fatal编程技术网

C# 实时绘制WPF的三维模型

C# 实时绘制WPF的三维模型,c#,3d,paintevent,C#,3d,Paintevent,在我的机器人控制程序中,应该有一个机器人与真实机器人同时移动的3D模型。我上传了3D模型,并在用鼠标释放滑块后更新其位置。一切都正常,但随着模型的实时更新,整个应用程序将冻结 如何每0.1秒绘制一个新的机器人模型,以便绘制不会减慢屏幕上其他信息的显示,也不会干扰按键 Thread-ThreadUpdateRobot=新线程(新线程开始(OnPointAsync)); ThreadUpdateRobot.Start(); 公共点() { Invoke(()=>UpdateObjectZveno(a

在我的机器人控制程序中,应该有一个机器人与真实机器人同时移动的3D模型。我上传了3D模型,并在用鼠标释放滑块后更新其位置。一切都正常,但随着模型的实时更新,整个应用程序将冻结

如何每0.1秒绘制一个新的机器人模型,以便绘制不会减慢屏幕上其他信息的显示,也不会干扰按键

Thread-ThreadUpdateRobot=新线程(新线程开始(OnPointAsync));
ThreadUpdateRobot.Start();
公共点()
{
Invoke(()=>UpdateObjectZveno(angleFor3D));
Dispatcher.Invoke(()=>pictureBox.Paint+=new System.Windows.Forms.PaintEventHandler(OnPaint));
Dispatcher.Invoke(()=>pictureBox.Invalidate());
}
私有void OnPaint(对象发送者,System.Windows.Forms.PaintEventArgs e)
{
对于(int i=0;iVector3.Transform(v,m)).ToList();
如果(调试模式)
{
var p1=新的点f(顶点[0].X,顶点[0].Y);
var p2=新的点f(顶点[1].X,顶点[1].Y);
使用(var pen=新系统.Drawing.pen(颜色,2))
gr.拉线(pen、p1、p2);
组抽屉(蓝色钢笔,p1.X-3,p1.Y-3,6,6);
第二组(蓝色钢笔,p2.X-3,p2.Y-3,6,6);
返回;
}
//创建图形SPATH
使用(var path=new GraphicsPath())
{
//创建面
var prev=Vector3.0;
var-prevF=0;
foreach(模型中的var f.图)
{
如果(f==0)path.CloseFigure();
var v=顶点[f];
如果(prevF!=0&&f!=0)
路径添加行(上一个X,上一个Y,上一个X,上一个Y);
prev=v;
prevF=f;
}
使用(var笔=新系统.Drawing.pen(颜色))
gr.DrawPath(笔、路径);
}
}
公共主窗口()
{
System.Windows.Forms.Integration.WindowsFormsHost host=新建System.Windows.Forms.Integration.WindowsFormsHost();
pictureBox=新System.Windows.Forms.pictureBox
{
锚点=System.Windows.Forms.AnchorStyles.Top,
背景色=System.Drawing.Color.White
};
pictureBox.Paint+=新系统.Windows.Forms.PaintEventHandler(OnPaint);
windowsFormsHost1.Child=pictureBox;
UpdateObjectBase();
pictureBox.Paint+=新系统.Windows.Forms.PaintEventHandler(OnPaint);
}
XAML



您已经在使用GDI+,这是一个加快绘图速度的好主意。但请不要使用winforms中的pictureBox来显示它。您可以绘制到位图中,然后创建位图的副本并调用以在wpf控件内显示它。是的,我知道pictureBox是一种糟糕的方法,但我的知识不足以将其传输到wpf,您究竟不知道什么?当前,您正在使用来自
Paint
事件句柄的
Graphics
。相反,创建自己的线程以包含绘制循环,在其中创建图形,按自己的方式绘制,然后将
Image.Source
设置为它(不要忘记使用
Dispatcher.Invoke
),重复。是一个考虑内存压力的代码段。您已经在使用GDI+,这是一个加快绘图速度的好主意。但请不要使用winforms中的pictureBox来显示它。您可以绘制到位图中,然后创建位图的副本并调用以在wpf控件内显示它。是的,我知道pictureBox是一种糟糕的方法,但我的知识不足以将其传输到wpf,您究竟不知道什么?当前,您正在使用来自
Paint
事件句柄的
Graphics
。相反,创建自己的线程以包含绘制循环,在其中创建图形,按自己的方式绘制,然后将
Image.Source
设置为它(不要忘记使用
Dispatcher.Invoke
),重复。是一个关注内存压力的代码段。