Unity3D关于模型变形技术代码实现
也欢迎⼤家转载本篇⽂章。分享知识,造福⼈民,实现我们中华民族伟⼤复兴!
本篇博客给读者介绍关于如何实现模型的变形,在项⽬开发中经常会涉及到模型的变形操作,⽐如如下效果图:
第⼀部分准备⼯作
⾸先在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[orig inalVertices.Length];  for (int i = 0; i < originalVertices.Length; i++) {  displacedVertices[i] = originalVertices[i];  } }
我们使⽤的是Start,因此也可以在Awake中⽣成过程⽹格,这⾸先被调⽤, 这种⽅法依赖于其他组件在Awake中的执⾏顺序, 您还可以调整脚本执⾏顺序,以强制执⾏谁是第⼀个和最后⼀个。
另外,顶点随着⽹格变形⽽移动, 所以我们也要存储每个顶点的速度。unity 教程
Vector3[] vertexVelocities; void Start () {  …  vertexVelocities = new Vector3[originalVertices.Length]; }
第⼆部分⽹格变形输⼊
我们需要⼀些⽅法来控制⽹格如何变形, 我们将使⽤⽤户输⼊,因此是交互式的, 每当⽤户触摸我们的对象时,我们将在这⼀点施加⼒量。
另外,MeshDeformer组件负责实际的变形,但不关⼼输⼊,我们应该创建⼀个单独的组件来处理⽤户输⼊, 给它⼀个可配置的输⼊⼒。using UnityEngine;public class MeshDeformerInput : MonoBehaviour { public float force = 10f;}
在这⾥要注意,将这个组件附加到相机是最有意义的, 我们不应该将其附加到变形⽹格物体,因为场景中可能有多个。
具体操作时,当按住默认⿏标按钮时,我们将处理⽤户的输⼊, 所以每当有点击或拖动时,只要⽤户按住。
void Update () {  if (Input.GetMouseButton(0)) {  HandleInput();  } }
现在我们必须弄清楚⽤户指向的位置,我们通过将相机的光线投射到场景来做到这⼀点, 我们将抓住场景的摄像头,
并使⽤它将光标位置转换为光线。
void HandleInput () {  Ray inputRay = Camera.main.usePosition); }
我们使⽤物理引擎投射射线并存储关于它所击中的信息, 如果射线与某物相撞,我们可以从被击中的对象中检索出MeshDeformer组件。
Ray inputRay = Camera.main.usePosition);  RaycastHit hit;  if (Physics.Raycast(inputRay, out hit)) {  MeshDeformer defor mer = llider.GetComponent<MeshDeformer>();  }
如果我们射线击中了⼀些东西,那东西有⼀个MeshDeformer组件,那么我们可以改变⼀些东西! 所以继续在接触点增加变形⼒。
MeshDeformer deformer = llider.GetComponent<MeshDeformer>();  if (deformer) {    Vector3 point = hit.point;    deformer.AddDeformingForce(p oint, force);  }
当然,假设我们的MeshDeformer组件具有AddDeformingForce⽅法。 所以添加这个⽅法。 不过,我们还没有做任何变形。 ⾸先,只需从主摄像头画⼀个调试线就可以看出光线。
public void AddDeformingForce (Vector3 point, float force) {  Debug.DrawLine(ansform.position, point); }
当⽹状物体被⽤户戳戳和凹陷。 这要求接触点附近的顶点被推⼊表⾯。 然⽽,变形⼒没有固有的⽅向。 它将在各个⽅向均匀地应⽤。 这将导致平坦表⾯上的顶点被推开,⽽不是向内推。
我们可以通过将⼒点拉离表⾯来增加⽅向,稍微偏移已经确保顶点总是被推⼊表⾯, 接触点的法线可以⽤作偏移⽅向。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。