2013-04-09 4 views
0

Я экспортировал некоторые частицы волос из Blender (прическа). Они состоят из нескольких строк (GL_LINES). Моя программа openGL отображает эти части без каких-либо проблем. Теперь я просто хочу применить световые свойства на этих участках. Blender не экспортирует векторы нормалей, поэтому мне нужно их самостоятельно вычислить. Я знаю следующее правило:Как вычислить нормали для линии сегмента в 3D

Если мы определяем отрезок линии как [AB] в двух измерениях, то имеем dx = xB - xA и dy = yB - yA, тогда нормали N1 (-dy, dx) и N2 (dy, -dx).

Надеюсь, я не ошибся.

Но я не знаю правила для определения сегмента 3D-пространства, если я добавлю размер z в координатах моего сегмента (например, A (5, 2, 3) и B (0, 0, -5)).

Кто-нибудь может мне помочь?

+7

Нет ни одного нормального для линии в 3D. Вместо этого сама линия является нормальной для плоскости. –

+1

Что сказал Аки Суйконен. Или, сформулированный наоборот: существует бесконечное число нормалей, лежащих на плоскости, перпендикулярной прямой. Чтобы вычислить один нормальный, вам нужно что-то «планарное», как треугольник. С другой стороны, линия может вращаться вокруг себя всячески, без возможности увидеть разницу. – Damon

ответ

1

С Aki забыл, что комментарии не отвечает:

Линии в 3D-пространстве не имеют нормальный. Технически, линии в 2D пространства также не имеют нормального; у них есть два нормалей.

Существует бесконечное число направлений, перпендикулярных линии в трехмерном пространстве. Все эти нормали находятся в одной плоскости, но с разными направлениями. Без какого-либо более продвинутого алгоритма (вероятно, основанного на смежных строках) нет возможности выбрать одну из этих нормалей над другой.

+0

Спасибо за ваш ответ. Но строка в openGL, как вы знаете, не является реальной линией. Он имеет крошечную поверхность. Доказательство - метод glLineWith(). Я увеличиваю масштаб до линии с шириной 10 пикселей, вы увидите, что линия представляет собой крошечный многоугольник. Таким образом, строка с шириной 1 (значение по умолчанию) также является крошечным полигоном. Таким образом, решение было бы сохранить координаты точек каждой линии (A (x, y, z) и B (x, y, z)) и создать (только для нормальных вычислений) многоугольник, слитый с линией. Значит, я мог бы вычислить нормали для этой линии? – user1364743

+3

@ user1364743: Линии OpenGL не имеют поверхности. И glLineWidth просто устанавливает ширину линии на экране. Линии OpenGL - это не крошечные цилиндры или полигоны, которые вы могли бы «взорвать». Я думаю, вы страдаете от нескольких очень сильных заблуждений OpenGL. OpenGL не знает, что такое сцена. Он даже не знает, что такое геометрия. Все, что он видит, это точки, линии и треугольники, которые нарисованы как 2D плоские фигуры на двумерном плоском фреймбуфере. Все сходство 3D просто происходит благодаря умному применению математики, которая создает изображение, которое выглядит как 3D, но на самом деле это не так. – datenwolf

+0

@ user1364743: Что касается ширины линии: OpenGL использует линейный растеризатор, очень похожий на растеризатор линии Bresenham. Google для «мыслить линии Bresenham», это то, что делает OpenGL. – datenwolf

1

Если вы предполагаете, что можете начать с двух векторов, и, похоже, это то, что вы говорите, назовите их v, w, чтобы получить нормальный вектор, взяв крест-произведение. Неплохая идея нормализовать v, w для начала, в зависимости от ситуации. Перекрестное произведение может быть представлено:

v x w =(v_2w_3 - v_3w_2, v_3x_1 - v_1w_3, v_1w_2 - v_3w_1), 

Здесь v_i является i-й составляющей v и т. Д. Цифры рядом друг с другом представляют собой умножение. У вас, конечно же, есть плюс или минус этот вектор, дающий две возможности.

+0

Кстати, чтобы получить два вектора, с которых вы начинаете, просто используйте любые два непараллельных сегмента в описанном многоугольнике. –

+0

Хорошо спасибо за ваш ответ. Я попробую это. У меня есть другое предложение. Скажи мне, если это будет возможно. Предположим, что у меня есть отрезок [AB]. Я вычисляю два полигона на двух концах (только для нормальных вычислений), перпендикулярных линиям. Следовательно, я могу вычислить пять нормалей полигоном, разделенным на 72 градуса (например). Поэтому для вычисления яркости на сегменте линии у меня было бы 10 нормалей, объединенных с полигоном. Думаю, это увеличит эффект светимости в 3D. Как вы думаете, это возможно ? – user1364743

+0

Я не знаю о ваших эффектах люминесценции, но вы получите только разные (не параллельные) нормали, если многоугольники, которые у вас есть, непараллельны в трехмерном пространстве, в котором вы находитесь. Я бы предложил рисовать изображение , –