Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Vector3.OrthoNormalize

Объявление

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 и гарантирует, что он ортогонален как normal, так и tangent.

Точки в пространстве обычно задаются координатами в стандартной системе осей 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 function.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3