![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вектора нормалей [Delphi, Windows]
basf © (2007-01-17 12:34:00)В одной книжонке по 3D-графике прочитал что по умолчанию за вектор нормали в OpenGL принимается вектор перпендикулярный к какой-либо плоскости (что, вроде бы, очевидно). Я рисую не самую сложную фигуру ("срезка" эллипсоида), при включении освещения объект пропадает, когда я нормали ставлю сам, то фигура видна, но так как я их ставлю с некоторой "погрешностью" получается не совсем то что надо. В общем, ставит OpenGL нормали сам или нет, может эту "опцию" нужно как-то включить, подскажите, plz, как их правильно расставить.
basf (2007-01-23 17:58:00) [1]Теперь задачка - наложить на это дело текстуру, но я с этим ещё мало разбирался и вопросов пока нет ...потом появятся ;-)
basf (2007-01-23 17:48:00) [2]Да уж, расчёт нормали с помощью векторного произв-я кажется вроде бы совсем несложным, а я то сначала через углы считал - кучу времени и нервов потратил, т.к. долго не получалось. Спасибо за ответы!
ors_archangel (2007-01-18 20:45:00) [3]В том же OpenGL отлично переключается :) glCullFace, если я не ошибаюсь, у меня друг один проект сначала писал CW (Clock-Wise, по часовой стрелке), а потом взял всё переделал на CCW (были причины, для взаимодействия с какой-то библиотекой), вобщем, выбор не принципиален, но тем не менее общепринятое решение здесь практически полезно
Думкин (2007-01-18 18:53:00) [4]> Ricks © (18.01.07 14:43) [26]
Тут такой момент - имеет место быть произвольность выбора, которая в конечном счете на результат не влияет.
Я же говорю: наряду с правилом правого буравчика, есть и правило левого. И ни одно животное от этого не пострадало.
Вот возьмем электричество. Движущийся заряд создает магнитное поле, это магнитное поле действует на другой движущийся заряд.
Как будем работать для счета? Работаем с векторными произведениями. Главное в них четко зафиксировать один выбор - куда итоговый направлять и все и с соответствующим выбором выписать законы. А примите ли вы по часовой или против - в реале два заряда все одно провзаимодействуют точно также. Фиксировать выбор надо при одной работе и содним и тем же набором обектов. Зафиксировать ориентацию. При этом выбора изначально - ровно два. И чем предложенный вами выбор лучше другого - я не знаю. Главное знать об этом и при обсуждении выяснять - какую ориентацию выбрал собеседник. И все. Остальное от лукавого. И в книгах многих, просто сообщают вначале - каким буравчиком они будут врезать вектора. Это хорошие книги. Те же кто не сообщает этого надеясь на "общепринятое" - поступают не совсем верно, если конечно это будет важно. Потому что иногда эо не очень важно. Главное знать, что есть +1 и -1.
ors_archangel (2007-01-18 16:09:00) [5]
> Ricks © (18.01.07 15:05) [27]
Ну, n = (0,0,0) не намного лучше в этом случае...
Тебе тоже нужно оптимизировать деление, и на ноль можно проверить перед Sqrt.
Извините, что придераюсь, люди, просто глаз режет, нормаль - это эе частая операция
Ricks (2007-01-18 15:05:00) [6]Кстати о делении на ноль итд итп (посты [3], [7])
если длинна вектора нулевая, то ни о какой дальнейшей нормализации не может быть и речи!
Ricks (2007-01-18 14:43:00) [7]
> @!!ex ©
Правую систему координат. А что?
> Думкин ©
Нет не только в конкрентых учебниках, это у нас на парах было (не думаю, что только в нашем институте указом ректора такую фигню ввели)! :)
Думкин (2007-01-18 14:33:00) [8]
> Ricks © (18.01.07 14:28) [23]
Про ЖЛ понимаю. Про аналитическую и далее - первый раз слышу. Если только в каких-нибудь конкретных учебниках.
@!!ex (2007-01-18 14:33:00) [9]
> Ricks © (18.01.07 13:35) [21]
А какую систему векторов образует векторное произведение? :)))
Ricks (2007-01-18 14:28:00) [10]
> Думкин ©
Ну просто должна она... должна и все! :)
Во всей аналитической геометрии и плюс еще в теоретической/аналитической механике нормаль выбирается именно так. Так уж принято...
А в OpenGL при неправильном выборе просто будет освещена другая сторона треугольника, исправить это можно домножением на (-1)
Думкин (2007-01-18 14:08:00) [11]
> Ricks © (18.01.07 13:35) [21]
>
> В трехмерном пространстве нормаль к поверхности треугольника
> должна быть направлена так, чтобы с её конца поворот на
> минимальный угол от одной стороны к другой был ПРОТИВ часовой
> стрелке!
Кому должна? если уж пишите, то пишите - должна так согласно стандарту ....
Никто никому ничего изначально никогда в этом не должен.
Ricks (2007-01-18 13:35:00) [12]
> @!!ex ©
> MBo ©
В трехмерном пространстве нормаль к поверхности треугольника должна быть направлена так, чтобы с её конца поворот на минимальный угол от одной стороны к другой был ПРОТИВчасовой стрелке!
Для товарища basfпредлагаю код (в принципе это уже было, но у меня немного по другому выглядит):
function PlaneNormal(Plane:array of TVector):TVector;
var v1, v2 : TVector;
begin
if Length(Plane) < 3
then Result:=VectorOrth( CrossProduct(Plane[0], Plane[1]) )
else begin
v1:=SubVector( Plane[0], Plane[1] );
v2:=SubVector( Plane[1], Plane[2] );
Result:=VectorOrth( CrossProduct(v1, v2) );
end;
end;
где:
TVector = record
x : single;
y : single;
z : single;
end;
function SubVector(v1, v2 : TVector):TVector;
begin
Result:=Vector( v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.z );
end;
function CrossProduct(v1, v2 : TVector):TVector; // векторное произведение
begin
Result.X:=v1.Y * v2.Z - v1.Z * v2.Y;
Result.Y:=v1.Z * v2.X - v1.X * v2.Z;
Result.Z:=v1.X * v2.Y - v1.Y * v2.X;
end;
function VectorOrth(v:TVector):TVector;
var L : single;
begin
L:=VectorLength( v );
if IsZero(L)
then Result:=NullVector
else Result:=Vector( v.X / L, v.Y / L, v.Z / L );
end;
function VectorLength(v:TVector):single;
begin
Result:=Sqrt( Sqr(v.X) + Sqr(v.Y) + Sqr(v.Z) );
end;
пользуясь этим набором функций каждый сможет самостоятельно посчитать себе нормаль к треугольнику! :)
XProger (2007-01-18 13:29:00) [13]Maya, 3ds max хранят нужный порядок вершин. При применении модификаторов по типу Normal - соотсветствующе меняют этот порядок. Никаких проблем с экспортом и дальнейшим расчётом нормалей быть не может.
Думкин (2007-01-18 13:19:00) [14]> @!!ex © (18.01.07 12:57) [18]
Да при чем тут АПИ и прочее? Я о высоком. :)
А еще есть правило правого буравчика и левого. :)
@!!ex (2007-01-18 12:57:00) [15]
> Думкин © (18.01.07 11:36) [17]
Это стандарт. Не знаю ни одного распространенного API, которое бы основывалось на другом стандарте.
Крестик закрывает окно. Это знание? Это стандарт.
Думкин (2007-01-18 11:36:00) [16]> @!!ex © (18.01.07 11:27) [16]
Это не знание, это предмет договора. Условность. Не инвариант.
@!!ex (2007-01-18 11:27:00) [17]Я о трехмерном пространстве и говорю. :))
У треугольника есть лицевая сторона и задная.
Определяется по тому, в какой последовательности заданы вершины.
Соответственно если почасовой - то он повернут лицевой стороной к пользователю - если против, значит задней.
А знать...
Ну вообще как можно писать графику без знания этого? Ведь на этом очень многие алгоритмы построены... Тоже нахождение нормалей. :)))
Плюс для оптимизации обычно не рисуют треугольники повернутые задней стороной. и т.д.
MBo (2007-01-18 10:55:00) [18]>нормальный треугольник - треугольник с вершинами заданными по часовой стрелке
А в трехмерном пространстве как?
Думкин (2007-01-18 10:36:00) [19]> @!!ex © (18.01.07 10:15) [13]
>
> > Думкин © (17.01.07 18:42) [5]
>
> Не думаю что это так. ИМХО каждый должен знать, что нормальный
> треугольник - треугольник с вершинами заданными по часовой
> стрелке.
Либо треугольник нормальный, либо я ненормальный. Никогда подобные благоглупости не заучивал. И почему то, что ты описал должен знать каждый - в упор не понимаю.
@!!ex (2007-01-18 10:15:00) [20]
> Думкин © (17.01.07 18:42) [5]
Не думаю что это так. ИМХО каждый должен знать, что нормальный треугольник - треугольник с вершинами заданными по часовой стрелке.
Если перемножать также по часовой - нормаль правильная получается.
Если я не ошибаюсь, конечно.