Я заранее прошу прощения за этот способ длинного поста.
Я работаю над функцией C #, чтобы объединить ориентацию треугольников меша для проекта Unity3D. Я использую тип Vector3
, который представляет собой структуру, составленную из float array [3]
.
Чтобы сделать это, я беру первый треугольник и проверяю, указывает ли он наружу или внутрь. После этого я проверяю наличие наименьшего и проверяю порядок индексов треугольника. Если я нахожу пару индексов в порядке, я переворачиваю их.
вот пример:
- индексы базового треугольника:
1 2 3
- индексы второго треугольника:
1 2 4
(1 2
в том же порядке, что и базовый треугольник, необходимо переключиться на 2 1 4
)
4 2 1
(2 1
не в том же порядке, то ничего не делать)
Проверка возвращает мне следующий треугольник, чтобы проверить, найдет ли он; в противном случае он возвращает нулевой вектор.
если «next» не равно NULL, я делаю «следующий» треугольник для «current», я сохраняю фиксированный треугольник в переменной, чтобы программа не продолжала проверять одни и те же индексы и повторяла проверку.
Проблема в том, что некоторая переменная обновляет свои значения до того, как инструкция испортит мои условия.
Как вы можете видеть в приведенном ниже коде, у меня есть действительно сложный оператор If, который пытается найти, присутствуют ли два треугольника в одном и том же порядке (необязательно в одной и той же позиции), например:
1 2 3 (base)
все следующие возможные результаты необходимо перевернуть на
1 2 4 -> 2 1 4
4 1 2 -> 1 4 2
2 4 1 -> 4 2 1
, что минус перед mesh.Index[]
необходим, потому что он использует IndexList
значения вместо mesh.Index
, и я не знаю почему.
Я использую эту пользовательскую структуру для тестирования программы вне Unity
public struct SimplifiedMesh
{
//this stores the order of the vertices needed to
//create all the triangles of the mesh.
public int[] Index;
it list all the vertices of the mesh
public Vector3[] Vertex;
};
IndexList
используется для хранения отмеченных треугольников. Сначала все значения положительны, но когда они проверяются на единицу, его показатели становятся отрицательными.
int[] IndexList = new int[Unimesh.Index.Length]; IndexList = Unimesh.Index;
Сначала я проверяю другим методом, чтобы определить, указывает ли лицо наружу или внутрь
FirstCheck(Unimesh, CentreofMesh, currentIndices);
//this will tell the program this triad is already checked
IndexList[currentIndices[0]] *= -1;
IndexList[currentIndices[0] + 1] *= -1;
IndexList[currentIndices[0] + 2] *= -1;
Следующее сейчас самое сложное. Вот легенда переменных:
currentIndices
- это Array[3]
, хранящий позицию трех индексов последнего проверенного треугольника в массиве mesh.Index
. Он используется, чтобы найти один;
next
- это возвращаемая переменная, которая возвращает следующий вектор, который будет рассматриваться для проверки, или ноль, если он не нашел никаких треугольников.
mesh.Index[currentIndices[0-1-2]
- текущие индексы
FlipNormals
получите индексы сетки, перейдите к трем индексам, указанным «Flipvector», и поменяйте местами первые два, инвертировав их порядок
и вот код
static int[] AdiacentFace(SimplifiedMesh mesh, int[] IndexList, int[] currentIndices)
{
int[] next = new int[3];
for (int i = 0; i < IndexList.Length; i += 3)
{
if (IndexList[i] > 0 || IndexList[i + 1] > 0)
{
if
// e restituisce la nuova terna modificata
((IndexList[i] == -mesh.Index[currentIndices[0]] && (IndexList[i + 1] == -mesh.Index[currentIndices[1]] || IndexList[i + 2] == -mesh.Index[currentIndices[2]])) ||
(IndexList[i + 1] == -mesh.Index[currentIndices[0]] && (IndexList[i + 2] == -mesh.Index[currentIndices[1]] || IndexList[i] == -mesh.Index[currentIndices[2]])) ||
(IndexList[i + 2] == -mesh.Index[currentIndices[0]] && (IndexList[i] == -mesh.Index[currentIndices[1]] || IndexList[i + 1] == -mesh.Index[currentIndices[2]])))
{
int[] Flipvector = new int[3];
Flipvector[0] = mesh.Index[i];
Flipvector[1] = mesh.Index[i+1];
Flipvector[2] = mesh.Index[i + 2];
FlipNormals(mesh, Flipvector);
// Elimina la terna per i successivi controlli
IndexList[i] *= -1;
IndexList[i + 1] *= -1;
IndexList[i + 2] *= -1;
// Ritorna gli indici del nuovo vettore
next[0] = i;
next[1] = i + 1;
next[2] = i + 2;
return next;
}
else if
((IndexList[i] == -mesh.Index[currentIndices[0]] && (IndexList[i + 2] == -mesh.Index[currentIndices[1]] || IndexList[i + 1] == -mesh.Index[currentIndices[2]])) ||
(IndexList[i + 1] == -mesh.Index[currentIndices[0]] && (IndexList[i] == -mesh.Index[currentIndices[1]] || IndexList[i + 2] == -mesh.Index[currentIndices[2]])) ||
(IndexList[i + 2] == -mesh.Index[currentIndices[0]] && (IndexList[i + 1] == -mesh.Index[currentIndices[1]] || IndexList[i] == -mesh.Index[currentIndices[2]])))
{
// Elimina la terna per i successivi controlli
IndexList[i] *= -1;
IndexList[i + 1] *= -1;
IndexList[i + 2] *= -1;
// Ritorna gli indici del nuovo vettore
next[0] = i;
next[1] = i + 1;
next[2] = i + 2;
return next;
}
}
}
next = null;
return next;
}