Определить намотку вершин (для отбраковки обратной стороны) в JavaFX и Point3D

Я нахожусь в процессе отображения j3d GeometryArrays как объединенных TriangularMeshes в JavaFX. Я знаю, что GeometryArrays, которые я получаю, являются TriangleStripArrays, и порядок позволяет мне строить правильные грани и отображать сетки в сцене.

Однако я не понимаю, как определить порядок намотки вершин, основываясь только на TriangleStripArray. В настоящее время лица не имеют правильного представления об отсечении задней поверхности, оставляя мне полную TriangleMesh, которая кажется искаженной под любым заданным углом. Изменив CullFaceMode с BACK на NONE и отобразив вершины в сцене, я могу сказать, что все лица отображаются правильно, просто отбраковываются непоследовательно.

У меня есть два метода, которые строят TriangleMesh из любой заданной треугольной грани, содержащей 3 вершины, один для намотки по часовой стрелке и один для против часовой стрелки.

По сути:

float[] points = {v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, v3.x, v3.y, v3.z};
float[] texCoords = {1, 1, 1, 0, 0, 1};
int[] faces = new int[]{0, 0, 1, 1, 2, 2};

vs

float[] points = {v2.x, v2.y, v2.z, v1.x, v1.y, v1.z, v3.x, v3.y, v3.z};
float[] texCoords = {1, 0, 1, 1, 0, 1};
int[] faces = new int[]{0, 0, 1, 1, 2, 2};

Мой вопрос в том, как я могу определить порядок намотки вершин и какой метод следует использовать для каждой грани, основываясь только на TriangleStripArray? (TexCoordinates предоставляются, но не используются)

Заранее спасибо! - Р. Мелвилл


person R. Melville    schedule 28.02.2017    source источник


Ответы (1)


Это можно решить, вычислив векторное произведение векторов (b-a) x (c-y), если a, b и c являются вершинами ваших треугольников.

У наших друзей из Math-Stackoverflow есть более подробное объяснение :-) -против часовой стрелки">почему-перекрестное-произведение-сообщает-нам-о-по-по часовой стрелке или против часовой стрелки

person mipa    schedule 28.02.2017