java3D反恐精英3_WPF实现平面三角形3D运动效果
本文实例为大家分享了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运动效果相关推荐
- php3D动画,html5的canvas实现几何模型3D运动动画效果
html5的canvas实现几何模型3D运动动画效果 JS片段: var {atan2,sqrt,sin,cos,PI,acos} = Math; function project3D(x,y,z,v ...
- 无需3D运动数据训练,最新人体姿势估计方法达到SOTA | CVPR 2020
作者 | Muhammed Kocabas 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 人体的运动对于理解人的行为是非常重要的.尽管目前已经在单图像3D姿势和动作估计方面取得 ...
- 使用three.js实现机器人手臂的运动效果
Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.你可以在它的主页上看到许多精彩的演示.不过,这款引擎目前还处在比较不成熟的开发阶段 ...
- CVPR2020|无需3D运动数据训练,最新SOTA人体姿势估计方法
点击我爱计算机视觉标星,更快获取CVML新技术 作者 | Muhammed Kocabas 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 人体的运动对于理解人的行为是非常重要的 ...
- php 3d animation,如何用HTML5的Canvas制作3D动画效果
HTML5的诞生给web前端界带来了不小轰动,像什么动画旋转.图片滑块.图片轮播等等这些3D特效,也引发了不少朋友想要学习HTML5的好奇心.最近我一直在做canvas动画效果,发现canvas这个东 ...
- EDIUS中的3D图层效果该如何制作
如果我们想要创建3D效果的场景的话,我们会选择使用真3D空间.Camera Maping等丰富的后期工具.因为小编这里是要给大家写EDIUS教程的,所以本节课当然还是以EDIUS为重点.EDIUS虽然 ...
- Linux 三维(3D)桌面效果软件的安装与实现
第一,三维效果的实现依靠硬件 显卡,首先要使你电脑的显卡驱动效果较佳化,这样你的电脑才能秀出最佳的三维效果.打开 硬件驱动(系统 -> 系统管理 -> 硬件驱动),输入密码并打开后会自动列 ...
- 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 ...
- android 动画x轴旋转,Android Roate3dAnimation实现围绕y轴竖直方向或者绕x轴方向旋转的3d动画效果...
概要: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Roate3dAnim ...
最新文章
- “夸夸机器人”App来了:变身百万粉丝大V,48万人给你的帖子点赞
- 在Swift中如何使用C中的Struct
- spring中事件发布设计与实现
- java红包算法·返回ListDouble
- POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...
- nginx+uwsgi 部署
- axure小程序模板_公众号和小程序模板消息
- LINUX版本的 MYSQL大小写敏感的处理方式
- matlab函数小结----数组区
- 计算机实验报告protel,PROTEL_99SE实验报告
- VMware 虚拟机Win10固定ip地址
- 01 社会网络分析基础理论!
- 机械设备维修报修小程序开发制作功能介绍
- java-net-php-python-jspm点餐管理系统计算机毕业设计程序
- 软件需求分析学习日记(一)需求工程概述
- ffmpeg编码x264
- 各种注释-注释多行与取消多行注释快捷键
- python与机器学习
- python安装mssql
- Struts2+Datagrid表格显示(可显示多表内容)