将向量标准化并使它们彼此正交。
标准化 tangent
。
标准化 tangent
并确保其与 normal
正交(即它们之间的角度为 90 度)。
另请参阅:Normalize 函数。
将向量标准化并使它们彼此正交。
标准化 tangent
。
标准化 tangent
并确保其与 normal
正交。
标准化 binormal
并确保其与 normal
和 tangent
正交。
空间中的点通常使用标准 XYZ 轴系的坐标指定。
但是,如果有任意三个向量为标准化向量(即其大小为 1)
并且彼此正交(即相互垂直),您就可以将它们解读为“轴”。
创建自己的坐标轴很有用,例如,若要在任意方向上缩放网格
而不只是沿 XYZ 轴缩放,则您可以将顶点变换到自己的坐标系,
对其进行缩放,然后再变换回来。通常情况下,这样的变换将仅沿一个轴进行,
另外两个轴要么保持不变,要么受到平等对待。
例如,可以通过在一个轴上放大,同时在另外两个轴上按比例缩小的方式
向网格应用拉伸效果。也就是说,一旦指定了第一个轴向量,
则另两个轴向量并不重要(只要它们是标准化并且正交的即可)。
OrthoNormalize 可用于确保第一个向量为标准化向量,
然后为其他两个轴生成标准化的正交向量。
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;
}
}
另请参阅:Normalize 函数。