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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 3D Поверхность по точкам (X,Y,Z), любые советы, примеры, исходники...  
:(
    Опции темы
Mixasik
Дата 20.7.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Нужна помощь как по точкам (X,Y,Z) построить поверхность в Delphi. Я решил использовать OpenGL, но вот проблема нигде не могу найти примера, совета... Просмотрел весь форум по 2-3 ответа, но все равно ничего не ясно. Мне бы для начала понять саму идею как это делается... Как мне показалось, облазил весь интернет, поэтому буду рад абсолютно любому совету, примеру...  smile 
Строить нужно имеено по точка, поверхность заведомо не известная.. и точки могут лежать как внутри нее так и на границе... Поверхность должна быть сеткой, то есть прозрачная отчасти...  smile 
PM MAIL ICQ   Вверх
Mixasik
Дата 21.7.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Что-то никто на эту тему не хочет говорить, даже идей)))  smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 21.7.2008, 16:20 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



  Есть идеи, времени нет smile . Нужно сделать обход точек по 3 штуки, посчитать нормали и загнать все это в опенгл, остальное он сам нарисует.


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

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

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


Little Delphi monstr
*


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

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



Благодарю. Вот хоть что-то... немножко бы подробнее было бы вообще чудесно smile Точки три это ясно, а вот как нормали к ним найти(это как я понял по уравнению плоскости в пространстве?), и еще вопрос если в массиве точек находятся те точки, которые не лежат на поверхности, а находятся внтри них, так как я понял, что при расчете некоторой функции 2-х переменных результатами будут точки не только на поверхности, но и внутри... Или не так?


Это сообщение отредактировал(а) Mixasik - 21.7.2008, 16:39
PM MAIL ICQ   Вверх
Alexeis
Дата 21.7.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Любой паре X, Y должно соответствовать уникальное значение Z по определению. 


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

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

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


Little Delphi monstr
*


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

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



Цитата(Alexeis @ 21.7.2008,  16:45)
Любой паре X, Y должно соответствовать уникальное значение Z по определению.

С пространственным мышлением у меня что-то плохо... То есть надо выделить три точки через которые можно провести плоскость, то есть они не должны лежать на одной прямой потом найти к ним нормаль... и вызвать некую функцию OpeGL? (Какую? Нужно чтобы поверхность как бы была обтянута сеткой и было видно поверхности за ней и т.д)

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


Амеба
Group Icon


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

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



Mixasik, на счет нормалей и добавления точек все уже было, нуна тока поиском воспользоваться. Эту задачу уже решали много раз.


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

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

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


Little Delphi monstr
*


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

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



А насчет сетки и видимости дальних поверхностей? smile
PM MAIL ICQ   Вверх
Alexeis
Дата 21.7.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Mixasik @  21.7.2008,  16:46 Найти цитируемый пост)
А насчет сетки и видимости дальних поверхностей?

  Нинаю чего ето. В Опенгл работает отсечение полигонов по нормалям + z-buffer. Этого хватает пока что, тем более что реализовано аппаратно в видеокартах.


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

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

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


Little Delphi monstr
*


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

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



То есть поверхность с меньшим числом z итак будет на заднем фоне? Я вот не понял одного - мне потребуется найти вершинные точки поверхности, а потом брав их по три находить нормаль?
И в итоге передавать в какую функцию?)
p.s Может как-нибудь я напишу по icq? smile 

Это сообщение отредактировал(а) Mixasik - 21.7.2008, 20:21
PM MAIL ICQ   Вверх
Alexeis
Дата 21.7.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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





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

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

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


Little Delphi monstr
*


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

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



Спасибо... буду копать в той стороне. Этот метод называется методом четверок?)
PM MAIL ICQ   Вверх
Bitter
Дата 21.7.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



А точки у тебя задаются сразу все или надо получать поверхность полсе каждой следующей точки?
Ну в любом случае это задача триангуляции. То есть разбиение набора точек на группы из 3-х точек...
После триангуляции у тебя будет n-2 треугольников, где n - кол-во точек.

А функция, возвращающая нормаль выглядит примерно так (но пример привожу для DirectX):

Код


type
  TD3DVector = packed record
    x,y,z : Single;
  end;
...........
function D3DVector(x, y, z: Single): TD3DVector;
begin
  Result.x := x;
  Result.y := y;
  Result.z := z;
end;

function VectorCrossProduct(const v1, v2: TD3DVector) : TD3DVector;
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 VectorDivS(const v: TD3DVector; s: Single) : TD3DVector;
begin
  result.x := v.x/s;
  result.y := v.y/s;
  result.z := v.z/s;
end;

function VectorMagnitude(v: TD3DVector) : Single;
begin
  result := sqrt((v.x*v.x) + (v.y*v.y) + (v.z*v.z));
end;

function VectorNormalize(const v: TD3DVector) : TD3DVector;
begin
  result := VectorDivS(v,VectorMagnitude(v));
end;

function GetNormal( P1,P2,P3:TD3DVector ) : TD3DVector;;
var b,a:TD3DVector;
begin
  a:=D3DVector( P2.x-P1.x , P2.y-P1.y , P2.z-P1.z);
  b:=D3DVector( P3.x-P1.x , P3.y-P1.y , P3.z-P1.z);
  Result:=VectorNormalize(VectorCrossProduct(a,b));
end;


Так что копай в сторону триангуляции

Это сообщение отредактировал(а) Bitter - 21.7.2008, 21:37
PM MAIL ICQ Skype   Вверх
Mixasik
Дата 21.7.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Благодарю... ТАк и сделаю... а точки задаются все сразу они считаются отдельно и потом передаются в компонент smile
PM MAIL ICQ   Вверх
Mixasik
Дата 22.7.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Допустим я всзял по три точки, нашел нормаль, а как дальше в openGL нарисовать поверхность(то есть обтянуть сеткой)?  smile 
PM MAIL ICQ   Вверх
TDM
Дата 22.7.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Mixasik, 
Грузишь текстуру сетки с альфой. Дальше рисуешь полик с ней:
Код

glBindTexture(GL_TEXTURE_2D, tex);
    glBegin(GL_TRIANGLES);
      glNormal3fv(@normal.x);
      glTexCoord2fv(@tc1.u); glVertex3fv(@v1.x);
      glTexCoord2fv(@tc2.u); glVertex3fv(@v2.x);
      glTexCoord2fv(@tc3.u); glVertex3fv(@v3.x);
    glEnd;


При инициализации нужно включить альфатест glEnable(GL_ALPHA_TEST);

Это сообщение отредактировал(а) TDM - 22.7.2008, 17:28
PM MAIL ICQ   Вверх
Mixasik
Дата 22.7.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



А можно подробнее? Что такое tex, tc1, tc2, tc3, v1, v2, v3?
PM MAIL ICQ   Вверх
TDM
Дата 22.7.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



tex - идентификатор загруженной текстуры
tc* текстурные координаты полигона
v* координаты вершин
PM MAIL ICQ   Вверх
Mixasik
Дата 22.7.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Понятно  smile Только вот еще один вопрос какого типа данных эти переменные?
PM MAIL ICQ   Вверх
TDM
Дата 22.7.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



vector2 = record
u : single;
v : single;
end;

vector3 = record
x : single;
y : single;
z : single;
end;

tex - cardinal
tc - vector2
v - vector3

Это сообщение отредактировал(а) TDM - 23.7.2008, 22:48
PM MAIL ICQ   Вверх
WaReZMEN
Дата 23.7.2008, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

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



Чесно говоря подобную задачу гораздо проще режить с помощью GLScens.
PM MAIL ICQ   Вверх
Mixasik
Дата 23.7.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



 smile как? Буду рад любой информации smile
PM MAIL ICQ   Вверх
Mixasik
Дата 23.7.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Цитата

function VectorDivS(const v: TD3DVector; s: Single) : TD3DVector;
begin
  result.x := v.x/s;
  result.y := v.y/s;
  result.z := v.z/s;
end;


А что такое в данном случае - "s"?
PM MAIL ICQ   Вверх
TDM
Дата 23.7.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Mixasik, 
число на которое делится вектор v smile 
PM MAIL ICQ   Вверх
WaReZMEN
Дата 24.7.2008, 04:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

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



http://glscene.ru/ Там есть примеры и форум... Скажу так мне как то нужно было сделать 3д график ввиде куба в катором были бы точки по трем координатом так я с помощью этой компоненты сделал все буквалня за 30 минут. Там есть работа с поверхностями и прочее... посомортри не подоидет можеш тогда дальше изобретать вилосипед smile
PM MAIL ICQ   Вверх
Mixasik
Дата 24.7.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Цитата(TDM @  23.7.2008,  22:45 Найти цитируемый пост)
Mixasik, число на которое делится вектор v  

Это я понимаю, только вот чему оно должно быть равно?)
PM MAIL ICQ   Вверх
TDM
Дата 24.7.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



оно может быть любым каким тебе надо
PM MAIL ICQ   Вверх
Mixasik
Дата 24.7.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Цитата(TDM @  24.7.2008,  20:45 Найти цитируемый пост)
оно может быть любым каким тебе надо

Понятно, я что-то не догадался... аоэксперементирую что зависит от его значения или ничего smile
PM MAIL ICQ   Вверх
TDM
Дата 24.7.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А что за вектор ты туда подставляешь?
PM MAIL ICQ   Вверх
Mixasik
Дата 24.7.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Который v3 то есть v1,v2 - это координаты первых 2 точек, а v в данном случае ретьей...
PM MAIL ICQ   Вверх
TDM
Дата 24.7.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И зачем его делить? Этож координата точки
PM MAIL ICQ   Вверх
Mixasik
Дата 24.7.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Хм.. Буду разбираться глубже, пока снова глупостей не сморозил...
PM MAIL ICQ   Вверх
TDM
Дата 24.7.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Делить надо при нормализировании нормали, когда делишь вектр на его длину. smile 
PM MAIL ICQ   Вверх
Mixasik
Дата 24.7.2008, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



Ясно, то есть когда найду координаты нормали надо их поделить на ее длину..?
PM MAIL ICQ   Вверх
TDM
Дата 24.7.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



да, только не координаты а вектор
PM MAIL ICQ   Вверх
Mixasik
Дата 1.8.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Little Delphi monstr
*


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

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



TDM, 
Цитата(TDM @  22.7.2008,  17:19 Найти цитируемый пост)
Mixasik, Грузишь текстуру сетки с альфой. Дальше рисуешь полик с ней:
КодincludeSyntax('delphi');glBindTexture(GL_TEXTURE_2D, tex);  
  glBegin(GL_TRIANGLES);   
   glNormal3fv(@normal.x);   
   glTexCoord2fv(@tc1.u); 
glVertex3fv(@v1.x);  
    glTexCoord2fv(@tc2.u); 
glVertex3fv(@v2.x);    
  glTexCoord2fv(@tc3.u);
 glVertex3fv(@v3.x);  
  glEnd;highlightSyntax('delphi_NGMyYj','delphi');
При инициализации нужно включить альфатест glEnable(GL_ALPHA_TEST);


Вот все таки не совсем понял, например у меня есть массив вершин
Код

TPoint3D = record
 x,y,z : double
Vertex = record
  v1,v2,v3,normal : TPoint3D;

v1,v2,v3 - это координаты 3-х точек треульника, normal - нормаль. Мне надо построить по этому массиву поверхность (должны быть точки обтянутые сеткой). Как мне быть?  smile 
PM MAIL ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

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


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

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


 




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


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

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