|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- using UnityEngine;
- using System.Collections;
-
- [System.Serializable]
- public class SkewModifier : MonoBehaviour
- {
- public Vector3 angles1;
- public Vector3 angles2;
- protected Vector3 angles1prev = Vector3.zero;
- protected Vector3 angles2prev = Vector3.zero;
- protected const float coeff = Mathf.PI/180;
- protected Mesh mesh;
-
- void Awake()
- {
- mesh = gameObject.GetComponent<MeshFilter>().mesh;
- }
-
- void Update()
- {
- if (angles1 != angles1prev || angles2 != angles2prev)
- updateMesh();
- }
-
- protected void updateMesh()
- {
- Matrix4x4 m = Matrix4x4.zero;
- m[0, 0] = 1;
- m[1, 1] = 1;
- m[2, 2] = 1;
- m[3, 3] = 1;
- m[0, 1] = Mathf.Tan(angles1.x * coeff) - Mathf.Tan(angles1prev.x * coeff); // skewing in xy
- m[0, 2] = Mathf.Tan(angles2.x * coeff) - Mathf.Tan(angles2prev.x * coeff); // skewing in xz
- m[1, 0] = Mathf.Tan(angles1.y * coeff) - Mathf.Tan(angles1prev.y * coeff); // skewing in yx
- m[1, 2] = Mathf.Tan(angles2.y * coeff) - Mathf.Tan(angles2prev.y * coeff); // skewing in yz
- m[2, 0] = Mathf.Tan(angles1.z * coeff) - Mathf.Tan(angles1prev.z * coeff); // skewing in zx
- m[2, 1] = Mathf.Tan(angles2.z * coeff) - Mathf.Tan(angles2prev.z * coeff); // skewing in zy
-
- Vector3[] verts = mesh.vertices;
- int i = 0;
- while (i < verts.Length)
- {
- verts[i] = m.MultiplyPoint3x4(verts[i]);
- i++;
- }
-
- mesh.vertices = verts;
- angles1prev = angles1;
- angles2prev = angles2;
- }
- }
|