Unity3D 关于模型变形技术代码实现

本文介绍如何在Unity3D中实现模型变形,包括准备工作、网格变形输入和基本变形的步骤。通过创建MeshDeformer脚本,处理用户输入来控制网格变形,实现交互式的模型变形效果。详细讲解了变形力的计算和应用,以及如何处理对象的转换,确保变形效果正确。代码下载链接:http://pan.baidu.com/s/1bP4qi6 密码:h1h5
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 本篇博客给读者介绍关于如何实现模型的变形,在项目开发中经常会涉及到模型的变形操作,比如如下效果图:

 

第一部分准备工作

 首先在Unity中建立一个场景,在场景中放置一个球体,这个球体可以使用Max工具建立,在球体上放几张Materials,效果如下所示:

 

 

 


 下面开始具体实现,创建一个新的MeshDeformer脚本来处理变形, 就像立方体球体组件一样,它需要一个网格过滤器来处理。 

using UnityEngine;[RequireComponent(typeof(MeshFilter))]public class MeshDeformer : MonoBehaviour {}

 将新组件脚本添加到球体上

 

 

 接下来要读取网格数据,要进行任何变形,我们需要访问网格。 一旦我们有了网格,我们可以提取原始的顶点位置, 我们还必须在变形期间跟踪位移的顶点。

 

 Mesh deformingMesh; Vector3[] originalVertices, displacedVertices;

 实现方式,在Start方法中获取网格及其顶点,并将原始顶点复制到移动的顶点。

 

 void Start () {  deformingMesh = GetComponent<MeshFilter>().mesh;  originalVertices = deformingMesh.vertices;  displacedVertices = new Vector3[originalVertices.Length];  for (int i = 0; i < originalVertices.Length; i++) {   displacedVertices[i] = originalVertices[i];  } }

 我们使用的是Start,因此也可以在Awake中生成过程网格,这首先被调用, 这种方法依赖于其他组件在Awake中的执行顺序, 您还可以调整脚本执行顺序,以强制执行谁是第一个和最后一个。

 另外,顶点随着网格变形而移动, 所以我们也要存储每个顶点的速度。

 

 Vector3[] vertexVelocities; void Start () {  …  vertexVelocities = new Vector3[originalVertices.Length]; }

 现在我们有了支持网格变形的基本成分,代码下载地址:链接:http://pan.baidu.com/s/1bP4qi6  密码:h1h5

   

第二部分网格变形输入

 我们需要一些方法来控制网格如何变形, 我们将使用用户输入,因此是交互式的, 每当用户触摸我们的对象时,我们将在这一点施加力量。

 另外,MeshDeformer组件负责实际的变形,但不关心输入,我们应该创建一个单独的组件来处理用户输入, 给它一个可配置的输入力。

 

using UnityEngine;public class MeshDeformerInput : MonoBehaviourpublic float force = 10f;}

  在这里要注意,将这个组件附加到相机是最有意义的, 我们不应该将其附加到变形网格物体,因为场景中可能有多个。

 


      具体操作时,当按住默认鼠标按钮时,我们将处理用户的输入, 所以每当有点击或拖动时,只要用户按住。 

 void Update () {  if (Input.GetMouseButton(0)) {   HandleInput();  } }

现在我们必须弄清楚用户指向的位置,我们通过将相机的光线投射到场景来做到这一点, 我们将抓住场景的摄像头,

并使用它将光标位置转换为光线。 

 

 void HandleInput () {  Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition); }

 我们使用物理引擎投射射线并存储关于它所击中的信息, 如果射线与某物相撞,我们可以从被击中的对象中检索出MeshDeformer组件。

 

  Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);  RaycastHit hit;  if (Physics.Raycast(inputRay, out hit)) {   MeshDeformer deformer = hit.collider.GetComponent<MeshDeformer>();  }
 

 如果我们射线击中了一些东西,那东西有一个MeshDeformer组件,那么我们可以改变一些东西! 所以继续在接触点增加变形力。

 

   MeshDeformer deformer = hit.collider.GetComponent<MeshDeformer>();   if (deformer) {    Vector3 p
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值