本文实例为大家分享了WPF实现平面三角形3D运动效果的具体代码,供大家参考,具体内容如下

实现效果如下:

思路:封装三角形三个顶点和路径的三角形类,图形渲染时同步更新公共顶点三角形的顶点位置。

步骤:

1、三角形类Triangle.cs

public Point A, B, C;//初始三个顶点

public Point VA, VB, VC;//运动的三个顶点

public Path trianglePath;//三角形路径

public Color triangleColor;//填充

public double ColorIndex;//颜色深度

public Triangle(Point a, Point b, Point c, Color co, double z)

{

A = VA = a;

B = VB = b;

C = VC = c;

triangleColor = co;

ColorIndex = z;

trianglePath = new Path();

Draw();

}

///

/// 绘制三角形

///

public void Draw()

{

var g = new StreamGeometry();

using (StreamGeometryContext context = g.Open())

{

context.BeginFigure(VA, true, true);

context.LineTo(VB, true, false);

context.LineTo(VC, true, false);

}

trianglePath.Data = g;

trianglePath.Fill = new SolidColorBrush(triangleColor);

}

2、 三角形系统类TriangleSystem.cs

public class TriangleSystem

{

///

/// 三角形列表

///

private List triangles;

///

/// 点和与其对应三角形字典

///

public Dictionary pointTriangles;

///

/// 容器

///

private Canvas containerCanvas;

///

/// 三角形宽

///

private int triangleWidth = 100;

///

/// 三角形高

///

private int triangleHeight = 100;

///

/// 三角形横向数量

///

private int horizontalCount = 10;

///

/// 三角形纵向数量

///

private int verticalCount = 5;

///

/// X坐标运动范围

///

private int XRange = 100;

///

/// Y坐标运动范围

///

private int YRange = 10;

///

/// 坐标运动速度

///

private int speed = 10;

///

/// 三角形颜色深度

///

private double zIndex = 10.0;

///

/// 随机数

///

private Random random;

public TriangleSystem(Canvas ca)

{

containerCanvas = ca;

random = new Random();

triangles = new List();

pointTriangles = new Dictionary();

SpawnTriangle();

}

///

/// 三角形初始化

///

private void SpawnTriangle()

{

//清空队列

triangles.Clear();

for (int i = 0; i < horizontalCount; i++)

{

for (int j = 0; j < verticalCount; j++)

{

Point A = new Point(i * triangleWidth, j * triangleHeight);

Point B = new Point(i * triangleWidth, (j + 1) * triangleHeight);

Point C = new Point((i + 1) * triangleWidth, (j + 1) * triangleHeight);

Point D = new Point((i + 1) * triangleWidth, j * triangleHeight);

double index = (i * horizontalCount / zIndex + j * verticalCount / zIndex ) / zIndex;

index = index > 1 ? 1 : index < 0.1 ? 0.1 : index;

Triangle t1 = new Triangle(A, B, C, GetTriangleColor(index), index);

Triangle t2 = new Triangle(A, D, C, GetTriangleColor(index - 0.1), index - 0.1);

//公共点和三角形集合键值对

AddPointTriangles(A, t1, t2);

AddPointTriangles(B, t1, t2);

AddPointTriangles(C, t1, t2);

AddPointTriangles(D, t1, t2);

//添加三角形

this.containerCanvas.Children.Add(t1.trianglePath);

this.containerCanvas.Children.Add(t2.trianglePath);

this.triangles.Add(t1);

this.triangles.Add(t2);

}

}

}

///

/// 添加公共点和三角形集合键值对

///

private void AddPointTriangles(Point p, Triangle t1, Triangle t2)

{

if (!this.pointTriangles.Keys.Contains(p))

{

List ts = new List();

ts.Add(t1);

ts.Add(t2);

PointClass pc = new PointClass

{

triangles = ts,

vector = new Vector(random.Next(-speed, speed) * 0.05, random.Next(-speed, speed) * 0.05),

};

this.pointTriangles.Add(p, pc);

}

else

{

if (!this.pointTriangles[p].triangles.Contains(t1))

this.pointTriangles[p].triangles.Add(t1);

if (!this.pointTriangles[p].triangles.Contains(t2))

this.pointTriangles[p].triangles.Add(t2);

}

}

///

/// 获取三角形颜色

///

private Color GetTriangleColor(double index)

{

return Color.FromArgb((byte)(255 * index), 230, 18, 65);

}

///

/// 更新三角形

///

public void Update()

{

foreach (var pt in pointTriangles)

{

foreach (var t in pt.Value.triangles)

{

if (t.A == pt.Key)

t.VA = GetPointValue(t.VA, t.A, ref pt.Value.vector, ref t.triangleColor, ref t.ColorIndex);

if (t.B == pt.Key)

t.VB = GetPointValue(t.VB, t.B, ref pt.Value.vector, ref t.triangleColor, ref t.ColorIndex);

if (t.C == pt.Key)

t.VC = GetPointValue(t.VC, t.C, ref pt.Value.vector, ref t.triangleColor, ref t.ColorIndex);

t.Draw();

}

}

}

///

/// 计算顶点值

///

private Point GetPointValue(Point p1, Point p2, ref Vector v, ref Color c, ref double index)

{

Point getPoint = new Point();

if (p1.X + v.X < p2.X + XRange && p1.X + v.X > p2.X - XRange)

getPoint.X = p1.X + v.X;

else

{

v.X = -v.X;

index = index > 1 ? index - 0.01 : index < 0.01 ? index + 0.01 : index - 0.01;

c = GetTriangleColor(index);

getPoint.X = p1.X + v.X;

}

if (p1.Y + v.Y < p2.Y + YRange && p1.Y + v.Y > p2.Y - YRange)

getPoint.Y = p1.Y + v.Y;

else

{

v.Y = -v.Y;

getPoint.Y = p1.Y + v.Y;

}

return getPoint;

}

}

3、PointClass.cs

public class PointClass

{

public List triangles;

public Vector vector;

}

4、主窗体交互逻辑

private TriangleSystem ts;

public MainWindow()

{

InitializeComponent();

ts = new TriangleSystem(this.mainCanvas);

CompositionTarget.Rendering += CompositionTarget_Rendering;

}

///

/// 帧渲染事件

///

private void CompositionTarget_Rendering(object sender, EventArgs e)

{

ts.Update();

}

不足:其中颜色渲染方式不够完善,无法完全模仿3D起伏的效果,有兴趣的可以一起探讨优化。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java3D反恐精英3_WPF实现平面三角形3D运动效果相关推荐

  1. php3D动画,html5的canvas实现几何模型3D运动动画效果

    html5的canvas实现几何模型3D运动动画效果 JS片段: var {atan2,sqrt,sin,cos,PI,acos} = Math; function project3D(x,y,z,v ...

  2. 无需3D运动数据训练,最新人体姿势估计方法达到SOTA | CVPR 2020

    作者 | Muhammed Kocabas 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 人体的运动对于理解人的行为是非常重要的.尽管目前已经在单图像3D姿势和动作估计方面取得 ...

  3. 使用three.js实现机器人手臂的运动效果

    Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.你可以在它的主页上看到许多精彩的演示.不过,这款引擎目前还处在比较不成熟的开发阶段 ...

  4. CVPR2020|无需3D运动数据训练,最新SOTA人体姿势估计方法

    点击我爱计算机视觉标星,更快获取CVML新技术 作者 | Muhammed Kocabas 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 人体的运动对于理解人的行为是非常重要的 ...

  5. php 3d animation,如何用HTML5的Canvas制作3D动画效果

    HTML5的诞生给web前端界带来了不小轰动,像什么动画旋转.图片滑块.图片轮播等等这些3D特效,也引发了不少朋友想要学习HTML5的好奇心.最近我一直在做canvas动画效果,发现canvas这个东 ...

  6. EDIUS中的3D图层效果该如何制作

    如果我们想要创建3D效果的场景的话,我们会选择使用真3D空间.Camera Maping等丰富的后期工具.因为小编这里是要给大家写EDIUS教程的,所以本节课当然还是以EDIUS为重点.EDIUS虽然 ...

  7. Linux 三维(3D)桌面效果软件的安装与实现

    第一,三维效果的实现依靠硬件 显卡,首先要使你电脑的显卡驱动效果较佳化,这样你的电脑才能秀出最佳的三维效果.打开 硬件驱动(系统 -> 系统管理 -> 硬件驱动),输入密码并打开后会自动列 ...

  8. After Effects Guru: Time-Lapse 3D Motion and Compositing After Effects Guru:延时3D运动和合成 Lynda课程中文字幕

    After Effects Guru: Time-Lapse 3D Motion and Compositing 中文字幕 After Effects Guru:延时3D运动和合成 中文字幕After ...

  9. android 动画x轴旋转,Android Roate3dAnimation实现围绕y轴竖直方向或者绕x轴方向旋转的3d动画效果...

    概要: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Roate3dAnim ...

最新文章

  1. “夸夸机器人”App来了:变身百万粉丝大V,48万人给你的帖子点赞
  2. 在Swift中如何使用C中的Struct
  3. spring中事件发布设计与实现
  4. java红包算法·返回ListDouble
  5. POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...
  6. nginx+uwsgi 部署
  7. axure小程序模板_公众号和小程序模板消息
  8. LINUX版本的 MYSQL大小写敏感的处理方式
  9. matlab函数小结----数组区
  10. 计算机实验报告protel,PROTEL_99SE实验报告
  11. VMware 虚拟机Win10固定ip地址
  12. 01 社会网络分析基础理论!
  13. 机械设备维修报修小程序开发制作功能介绍
  14. java-net-php-python-jspm点餐管理系统计算机毕业设计程序
  15. 软件需求分析学习日记(一)需求工程概述
  16. ffmpeg编码x264
  17. 各种注释-注释多行与取消多行注释快捷键
  18. python与机器学习
  19. python安装mssql
  20. Struts2+Datagrid表格显示(可显示多表内容)

热门文章

  1. api接口 服务器是腾讯的lol服务器
  2. # iOS进阶 # 崩溃与日志分析
  3. Android Studio安装及环境配置教程
  4. 三种近场通信技术特点与未来展望
  5. Chapter 14 Greenplum PL/R Language Extension
  6. 【三维重建系列】相机模型部分公式详解记录
  7. Auto-Job 任务调度框架
  8. 苹果在中国高端手机市场继续夺取市场,华为受挤压
  9. 电脑照片误删了怎么恢复
  10. SpringMVC V4.1入门超详细解析