版本: Unity 6 (6000.0)
语言英语
  • C#

Vector3.OrthoNormalize

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交的内容,但我们会阅读用户提出的每一项更改建议,并在适当的地方进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

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

描述

使向量归一化并相互正交。

归一化 normal。归一化 tangent 并确保它与 normal 正交(即它们之间的夹角为 90 度)。

其他资源: Normalize 函数。


声明

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

描述

使向量归一化并相互正交。

归一化 normal。归一化 tangent 并确保它与 normal 正交。归一化 binormal 并确保它与 normaltangent 都正交。

空间中的点通常用标准 XYZ 轴系统中的坐标来指定。但是,如果您将三个向量解释为“轴”,那么它们就可以被解释为“轴”,只要它们是归一化的(即,大小为 1)且正交(即,相互垂直)。

创建自己的坐标轴很有用,例如,如果您想沿任意方向缩放网格而不是仅仅沿着 XYZ 轴缩放 - 您可以在自己的坐标系中转换顶点,缩放它们,然后转换回来。通常,这种变换只沿一个轴进行,而另外两个轴要么保持不变,要么被平等对待。例如,可以通过沿一个轴向上缩放,而沿另外两个轴按比例向下缩放来对网格应用拉伸效果。这意味着,一旦第一个轴向量被指定,另外两个轴向量是什么并不重要,只要它们是归一化的且正交即可。OrthoNormalize 可用于确保第一个向量是法向量,然后为另外两个轴生成两个归一化的正交向量。

// Mesh "stretch" effect along a chosen axis.

using UnityEngine; using System.Collections;

public class ExampleClass : MonoBehaviour { // The axis and amount of scaling. public Vector3 stretchAxis; public float stretchFactor = 1.0F;

// MeshFilter component and arrays for the original and transformed vertices. private MeshFilter mf; private Vector3[] origVerts; private Vector3[] newVerts;

// Our new basis vectors. private Vector3 basisA; private Vector3 basisB; private Vector3 basisC;

void 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]; }

void Update() { // BasisA is just the specified axis for stretching - the // other two are just arbitrary axes generated by OrthoNormalize. basisA = stretchAxis; Vector3.OrthoNormalize(ref basisA, ref basisB, ref 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). Matrix4x4 toNewSpace = new Matrix4x4(); toNewSpace.SetRow(0, basisA); toNewSpace.SetRow(1, basisB); toNewSpace.SetRow(2, basisC); toNewSpace[3, 3] = 1.0F;

// 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. 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;

// 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). Matrix4x4 fromNewSpace = toNewSpace.transpose;

// The three matrices can now be combined into a single symmetric matrix. Matrix4x4 trans = toNewSpace * scale * fromNewSpace;

// Transform each of the mesh's vertices by the symmetric matrix. int i = 0; while (i < origVerts.Length) { newVerts[i] = trans.MultiplyPoint3x4(origVerts[i]); i++; }

// ...and finally, update the mesh with the new vertex array. mf.mesh.vertices = newVerts; } }

其他资源: Normalize 函数。