Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычислить нормали 
:(
    Опции темы
sfok3
Дата 24.10.2009, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 14.7.2009

Репутация: нет
Всего: нет



Здравствуйте у меня есть массив с данными типа TCustomVertex

TCustomVertex = packed record
x, y, z: Single;
nx, ny, nz:single;
color: DWORD;
end;

Создаю буфера вершин по координатам x, y, z
Как мне вычислить нормаль (nx, ny, nz) для каждой вершины (x, y, z)?

Вычитал только: Нельзя вычислить нормаль для вершины, потому что это всего лишь точка в пространстве.
Но как мне тогда решить проблему 

вот так у меня заполняется массив:

Код

SetLength(vertices , rows*cols*6);
  index := 0;
  for col:=0 to cols-2 do
  for row:=0  to  rows-2 do
  begin
  vertices[index].x:=row;          vertices[index].y:=land[row,col];      vertices[index].z:= col;
  vertices[index].color:=$00FF0000;
  vertices[index].nx :=?;      vertices[index].ny :=?;  vertices[index].nz :=?;

  vertices[index+1].x:=row;          vertices[index+1].y:=land[row,col+1];      vertices[index+1].z:= col+1;
  vertices[index+1].color:=$00FF0000;
  vertices[index+1].nx :=?;      vertices[index+1].ny :=?;  vertices[index+1].nz :=?;

  vertices[index+2].x:=row+1;          vertices[index+2].y:=land[row+1,col];      vertices[index+2].z:= col;
  vertices[index+2].color:=$00FF0000;
  vertices[index+2].nx :=?;      vertices[index+2].ny :=?;  vertices[index+2].nz :=?;

  vertices[index+3].x:=row+1;          vertices[index+3].y:=land[row+1,col];      vertices[index+3].z:= col;
  vertices[index+3].color:=$00FF0000;
  vertices[index+3].nx :=?;      vertices[index+3].ny :=?;  vertices[index+3].nz :=?;

  vertices[index+4].x:=row;          vertices[index+4].y:=land[row,col+1];      vertices[index+4].z:= col+1;
  vertices[index+4].color:=$00FF0000;
  vertices[index+4].nx :=?;      vertices[index+4].ny :=?;  vertices[index+4].nz :=?;

  vertices[index+5].x:=row+1;          vertices[index+5].y:=land[row+1,col+1];      vertices[index+5].z:= col+1;
  vertices[index+5].color:=$00FF0000;
  vertices[index+5].nx :=?;      vertices[index+5].ny :=?;  vertices[index+5].nz :=?;
  index := index+6;
  end;

PM MAIL   Вверх
Alexeis
Дата 24.10.2009, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(sfok3 @  24.10.2009,  02:27 Найти цитируемый пост)
Как мне вычислить нормаль (nx, ny, nz) для каждой вершины (x, y, z)?

  Вот смотри, векторное произведение векторов дает вектор перпендикулярный плоскости образованной 2мя векторами. Чтобы получить 2 вектора нужно как минимум 3 точки в плоскости. Векторное произведение векторов можно вычислить примерно так
Код

  Vector = Record
             x,y,z : Extended
           end;

  Function VMultVector(v1,v2 : Vector) : Vector;
    Begin
      VMultVector.x := v1.y*v2.z - v2.y*v1.z;
      VMultVector.y := v1.x*v2.z - v2.x*v1.z;
      VMultVector.z := v1.x*v2.y - v2.x*v1.y
    end;


Вектор получается вычитанием соответствующих координат 2х точек {(x2-x1), (y2-y1), (z2-z1)} , 
 {(x3-x2), (y3-y2), (z3-z2)}.

И еще я думаю понадобиться не просто нормаль, а нормализованная нормаль, т.е. Нормаль длинный в единицу. Это значит что каждую из координат вектора нормали нужно поделить на модуль вектора нормали.

Добавлено через 2 минуты и 52 секунды
  А и еще. При по разному выбирая точки для 2х векторов в грани можно получить 2е нормали, внутреннюю и наружную. Это имеет значение. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RomanEEP
Дата 25.10.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 1
Всего: 8



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

Судя по всему, твоя поверхность - карта высот в плоскости ХZ. Самое простое будет задать нормаль (nx = 0, ny = 1, nz = 0).
Можно получить результат лучше, если посчитать нормаль исходя из 4 соседних точек карты высот. Если нужно - пиши.

ЗЫ: Тут будут нужны некоторые функции векторной геометрии, поэтому, чтобы не заниматься изобретением велосипеда, рекомендую взять файлы VectorTypes.pas и VectorGeometry.pas из исходников GLScene
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0844 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.