插件(二)ShatterToolkit初探
2016-04-18 10:11
323 查看
ShatterToolkit是针对unity3d编写的一款粉碎模型的插件,应该在当时切西瓜游戏很火的时候就已经出现了,不过因为能力不够没想着去接触,现在刚好有空就去下载下来看看。
免费的下载地址仅供学习http://download.csdn.net/detail/l364244206/8411949
直奔主题将插件导入到unity中,打开切西瓜的场景UvMapping,用鼠标划几下完好的西瓜被切成一块块的了
再来分析插件的功能,我们可以将代码划分为三层:
1.操作层
菜单MouseForce:
通过这个脚本可以对模型进行拖拽,根据当前鼠标左键按下的位置和鼠标移动后的位置在单位增量时间内的差值计算力度,并将这个力通过AddForceAtPosition附加给带有刚体属性的对象。
菜单MouseSplit:
这个脚本用于对模型的切割,按下当前鼠标左键拖动鼠标然后抬起,记录开始位置和结束位置,一帧内在屏幕空间从开始点到结束点默认相等划分为10个点(数值越大敏感度越高性能越差),并向世界坐标发射10条射线,根据【射线方向】和【划线方向】叉乘得到【法线】,通过【法线】和【当前射线点】就能确定一个【平面】,最后将这个【平面信息】传给【ShatterTool类】进行切割处理。
菜单MouseShatter:
这个脚本用于击毁模型,直接点击模型就可以将模型粉碎,上层只是通过屏幕向世界发射一条射线并传给【ShatterTool类】进行粉碎模型。
2.中间层
脚本ShatterTool:
其中两个函数对外:
Split(Plane[]planes)函数将获取的【面板信息】变换到【对象空间】然后通过Hull类进行切割,最后生成两个新切割后的对象。
Shatter(Vector3point)函数通过获取的【击打点】并随机生成【法线方向】创建不同的【面板信息】,然后再调用Split生成多个切割碎片,达到粉碎模型的效果。
脚本UvMapper:
它的基类有WorldUvMapper和TargetUvMapper都是设置切割面的纹理信息,WorldUvMapper设置切割面的uv缩放,TargetUvMapper比较灵活,可以设置uv起点和大小等。
3.底层
脚本Hull等:
之所以称Hull为底层,是因为它通过【面板panel信息】将模型进行拆分然后重组顶点,里面封装了一系列比较复杂的算法。
贴上一段中间连接层代码:
免费的下载地址仅供学习http://download.csdn.net/detail/l364244206/8411949
直奔主题将插件导入到unity中,打开切西瓜的场景UvMapping,用鼠标划几下完好的西瓜被切成一块块的了
再来分析插件的功能,我们可以将代码划分为三层:
1.操作层
菜单MouseForce:
通过这个脚本可以对模型进行拖拽,根据当前鼠标左键按下的位置和鼠标移动后的位置在单位增量时间内的差值计算力度,并将这个力通过AddForceAtPosition附加给带有刚体属性的对象。
菜单MouseSplit:
这个脚本用于对模型的切割,按下当前鼠标左键拖动鼠标然后抬起,记录开始位置和结束位置,一帧内在屏幕空间从开始点到结束点默认相等划分为10个点(数值越大敏感度越高性能越差),并向世界坐标发射10条射线,根据【射线方向】和【划线方向】叉乘得到【法线】,通过【法线】和【当前射线点】就能确定一个【平面】,最后将这个【平面信息】传给【ShatterTool类】进行切割处理。
菜单MouseShatter:
这个脚本用于击毁模型,直接点击模型就可以将模型粉碎,上层只是通过屏幕向世界发射一条射线并传给【ShatterTool类】进行粉碎模型。
2.中间层
脚本ShatterTool:
其中两个函数对外:
Split(Plane[]planes)函数将获取的【面板信息】变换到【对象空间】然后通过Hull类进行切割,最后生成两个新切割后的对象。
Shatter(Vector3point)函数通过获取的【击打点】并随机生成【法线方向】创建不同的【面板信息】,然后再调用Split生成多个切割碎片,达到粉碎模型的效果。
脚本UvMapper:
它的基类有WorldUvMapper和TargetUvMapper都是设置切割面的纹理信息,WorldUvMapper设置切割面的uv缩放,TargetUvMapper比较灵活,可以设置uv起点和大小等。
3.底层
脚本Hull等:
之所以称Hull为底层,是因为它通过【面板panel信息】将模型进行拆分然后重组顶点,里面封装了一系列比较复杂的算法。
贴上一段中间连接层代码:
public void Split(Plane[] planes)
{
if
(sendPreSplitMessage)
{
// 切割之前的操作
SendMessage(
"PreSplit"
,planes,SendMessageOptions.DontRequireReceiver);
}
if
(planes !=
null
&& planes.Length > 0 && hull !=
null
&& !hull.IsEmpty)
{
if
(uvMapper !=
null
)
{
Plane[] localPlanes;
// 创建本地面板信息
CreateLocalPlanes(planes,out localPlanes);
IList newHulls;
// 通过本地面板创建新的分割对象
CreateNewHulls(localPlanes,out newHulls);
GameObject[] newGameObjects;
// 通过分割对象创建新的游戏对象
CreateNewGameObjects(newHulls,out newGameObjects);
if
(sendPostSplitMessage)
{
// 切割之后的操作
SendMessage(
"PostSplit"
,newGameObjects,SendMessageOptions.DontRequireReceiver);
}
// 销毁当前对象
Destroy(gameObject);
}
else
{
Debug.LogWarning(name +
" has no UvMapper attached! Please attach a UvMapper to use the ShatterTool."
,
this
);
}
}
}
如需商业用途或想了解更多 请支持原作者:http://gustavolsson.squarespace.com/shatter-toolkit/
相关文章推荐
- java中HashMap和HashSet的实现
- Android获取屏幕宽高新方法
- 关于mysql授权账号权限时的空密码问题
- 认识C和内存管理
- jquery的ajax同步和异步
- HDU 4135 Co-prime (包含排斥原理+筛选法求素数)
- J2SE(四)Java之类的详解
- android加边框处理方式
- Fragment基本使用
- 插件(一)武器拖尾效果
- anroid中httpclient异步下载
- Python 实现键盘操作之Crtl+方向键
- 把textarea右下角的灰点去掉
- 属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在哪种情况下用?
- Haar特征理解
- eclipse package,source folder,folder区别及相互转换
- Matlab图像边缘检测Roberts\Sobel\Prewitt\Canny算子
- JDBC技术
- 利用HTML5定位功能获取经纬度,在根据经纬度利用百度地图获取位置信息
- USB设备驱动开发-USB协议相关