Version: 2017.1

# Vector3.OrthoNormalize

マニュアルに切り替える
public static void OrthoNormalize (ref Vector3 normal, ref Vector3 tangent);

## 説明

ベクトルが正規化され他のベクトルと直交するようにします

Normalizes `normal`. Normalizes `tangent` and makes sure it is orthogonal to `normal` (that is, angle between them is 90 degrees).

public static void OrthoNormalize (ref Vector3 normal, ref Vector3 tangent, ref Vector3 binormal);

## 説明

ベクトルが正規化され他のベクトルと直交するようにします

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`.

Points in space are usually specified with coordinates in the standard XYZ axis system. However, you can interpret any three vectors as "axes" if they are normalized (ie, have a magnitude of 1) and are orthogonal (ie, perpendicular to each other).

Creating your own coordinate axes is useful, say, if you want to scale a mesh in arbitrary directions rather than just along the XYZ axes - you can transform the vertices to your own coordinate system, scale them and then transform back. Often, a transformation like this will be carried out along only one axis while the other two are either left as they are or treated equally. For example, a stretching effect can be applied to a mesh by scaling up on one axis while scaling down proportionally on the other two. This means that once the first axis vector is specified, it doesn't greatly matter what the other two are as long as they are normalized and orthogonal. OrthoNormalize can be used to ensure the first vector is normal and then generate two normalized, orthogonal vectors for the other two axes.

```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;
}
}
```