Makes vectors normalized and orthogonal to each other.
Normalizes normal
.
Normalizes tangent
and makes sure it is orthogonal to normal
(that is, angle between them is 90 degrees).
Makes vectors normalized and orthogonal to each other.
Normalizes normal
.
Normalizes tangent
and makes sure it is orthogonal to normal
.
Normalizes binormal
and makes sure it is orthogonal to both normal
and tangent
.
// Mesh "stretch" effect along a chosen axis. // The axis and amount of scaling. var stretchAxis: Vector3; var stretchFactor = 1.0; // MeshFilter component and arrays for the original and transformed vertices. private var mf: MeshFilter; private var origVerts: Vector3[]; private var newVerts: Vector3[]; // Our new basis vectors. private var basisA: Vector3; private var basisB: Vector3; private var basisC: Vector3; function Start() { // Get the Mesh Filter, then make a copy of the original vertices // and a new array to calculate the transformed vertices. mf = GetComponent.<MeshFilter>(); origVerts = mf.mesh.vertices; newVerts = new Vector3[origVerts.Length]; } function Update() { // BasisA is just the specified axis for stretching - the // other two are just arbitrary axes generated by OrthoNormalize. basisA = stretchAxis; Vector3.OrthoNormalize(basisA, basisB, basisC); // Copy the three new basis vectors into the rows of a matrix // (since it is actually a 4x4 matrix, the bottom right corner // should also be set to 1). var toNewSpace: Matrix4x4 = new Matrix4x4(); toNewSpace.SetRow(0, basisA); toNewSpace.SetRow(1, basisB); toNewSpace.SetRow(2, basisC); toNewSpace[3, 3] = 1.0; // The scale values are just the diagonal entries of the scale // matrix. The vertices should be stretched along the first axis // and squashed proportionally along the other two. var scale: Matrix4x4 = new Matrix4x4(); scale[0, 0] = stretchFactor; scale[1, 1] = 1.0 / stretchFactor; scale[2, 2] = 1.0 / stretchFactor; scale[3, 3] = 1.0; // The inverse of the first matrix transforms the vertices back to // the original XYZ coordinate space(transpose is the same as inverse // for an orthogonal matrix, which this is). var fromNewSpace: Matrix4x4 = toNewSpace.transpose; // The three matrices can now be combined into a single symmetric matrix. var trans: Matrix4x4 = toNewSpace * scale * fromNewSpace; // Transform each of the mesh's vertices by the symmetric matrix. for (var i = 0; i < origVerts.Length; i++) { newVerts[i] = trans.MultiplyPoint3x4(origVerts[i]); } // ...and finally, update the mesh with the new vertex array. mf.mesh.vertices = newVerts; }
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Vector3 stretchAxis; public float stretchFactor = 1.0F; private MeshFilter mf; private Vector3[] origVerts; private Vector3[] newVerts; private Vector3 basisA; private Vector3 basisB; private Vector3 basisC; void Start() { mf = GetComponent<MeshFilter>(); origVerts = mf.mesh.vertices; newVerts = new Vector3[origVerts.Length]; } void Update() { basisA = stretchAxis; Vector3.OrthoNormalize(ref basisA, ref basisB, ref basisC); Matrix4x4 toNewSpace = new Matrix4x4(); toNewSpace.SetRow(0, basisA); toNewSpace.SetRow(1, basisB); toNewSpace.SetRow(2, basisC); toNewSpace[3, 3] = 1.0F; Matrix4x4 scale = new Matrix4x4(); scale[0, 0] = stretchFactor; scale[1, 1] = 1.0F / stretchFactor; scale[2, 2] = 1.0F / stretchFactor; scale[3, 3] = 1.0F; Matrix4x4 fromNewSpace = toNewSpace.transpose; Matrix4x4 trans = toNewSpace * scale * fromNewSpace; int i = 0; while (i < origVerts.Length) { newVerts[i] = trans.MultiplyPoint3x4(origVerts[i]); i++; } mf.mesh.vertices = newVerts; } }
import UnityEngine import System.Collections public class ExampleClass(MonoBehaviour): public stretchAxis as Vector3 public stretchFactor as float = 1.0F private mf as MeshFilter private origVerts as (Vector3) private newVerts as (Vector3) private basisA as Vector3 private basisB as Vector3 private basisC as Vector3 def Start() as void: mf = GetComponent[of MeshFilter]() origVerts = mf.mesh.vertices newVerts = array[of Vector3](origVerts.Length) def Update() as void: basisA = stretchAxis Vector3.OrthoNormalize(, , ) toNewSpace as Matrix4x4 = Matrix4x4() toNewSpace.SetRow(0, basisA) toNewSpace.SetRow(1, basisB) toNewSpace.SetRow(2, basisC) toNewSpace[3, 3] = 1.0F scale as Matrix4x4 = Matrix4x4() scale[0, 0] = stretchFactor scale[1, 1] = (1.0F / stretchFactor) scale[2, 2] = (1.0F / stretchFactor) scale[3, 3] = 1.0F fromNewSpace as Matrix4x4 = toNewSpace.transpose trans as Matrix4x4 = ((toNewSpace * scale) * fromNewSpace) i as int = 0 while i < origVerts.Length: newVerts[i] = trans.MultiplyPoint3x4(origVerts[i]) i++ mf.mesh.vertices = newVerts
See Also: Normalize function.