Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вектора нормалей [Delphi, Windows]


Страницы:   1 2

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]

Не думаю что это так. ИМХО каждый должен знать, что нормальный треугольник - треугольник с вершинами заданными по часовой стрелке.
Если перемножать также по часовой - нормаль правильная получается.
Если я не ошибаюсь, конечно.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо