![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| MacTep |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: нет Всего: 4 |
Привет всем! Как узнать, в OpenGL, что координаты курсора мыши в момент нажатия левой кнопки находятся в пределах нарисованной на экране сферы? Сферу рисую при помощи gluQuadric.
-------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
| MacTep |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: нет Всего: 4 |
Небольшое дополнение: нужно узнать по щелчку левой кнопки мыши координаты текстуры, наложенной на эту самую сферу.
-------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
| PHARAOH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.2.2005 Репутация: нет Всего: нет |
А если разложить по полочкам!
При нажатии левой кнопки мыши ты получаешь х и у, а по z ты собственно должен провести прямую до поверхности сферы! т.е. если будешь рисовать сферу не через GluSphere, а через загрузку из файла - набора треугольников и вершин, то в принципе можно определить треугольник на который ты тыцнул мышой (Хцентра объекта -Х мыши, ...,Z:=вектор(Хцентра объекта, Хцентра объекта -Х мыши,...)) помоему так! |
|||
|
||||
| PHARAOH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.2.2005 Репутация: нет Всего: нет |
На сайте http://delphigfx.mastak.ru/ есть пример экспорта объекта с текстурой из 3dmax. (примерчик и плаг немного глючные, но...)
Там расписана текстура по треугольникам. А если у тебя будут координаты треугольника на который ты тыцнул, то координаты текстуры наложеной на этот треугольник я думаю ты вычислить сможешь! Попробуй так может получится чаво! |
|||
|
||||
| PHARAOH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.2.2005 Репутация: нет Всего: нет |
Все что я написал выше фигня.
Только что зашел http://delphigfx.mastak.ru/3d/001/3d_1.htm там есть очень прикольный пример: Пример 1 Закрашиваем полигоны .... point:TVertex; .... begin // Получаем выбранный полигон при нажатии на панель Panel1 mouse.FindVertex(x,panel1.height-y,Scene,point); for i:=1 to numFound do // Для всех полигонов найденных по Mouse.FindVertex begin poly:=VertexHits[i] shr 16; vert:=VertexHits[i] mod 65536; If (poly "<" Dolphin.Faces.count) and (vert"<"Tface(Dolphin.Faces.Items[poly]).Vertices.count) then begin // получаем составляющие цвета из ColorActual (TColor) ir:=(ColorActual) mod 256; // R ig:=(ColorActual shr 8) mod 256; // G ib:=(ColorActual shr 16) mod 256; // B Tvertex(Tface(Dolphin.Faces.Items[poly]. Vertices.items[vert]).point.setcolor(ir,ig,ib); end; end; end; |
|||
|
||||
| MacTep |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1292 Регистрация: 4.8.2003 Где: г. Самара Репутация: нет Всего: 4 |
PHARAOH, что-то я не догнал про полигоны. Можно чуть подробнее о сфере или на ее примере?
-------------------- (A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :) |
|||
|
||||
| PHARAOH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.2.2005 Репутация: нет Всего: нет |
Сам попробовоать еще не успел но очень интересный код:
GlFeedBackBuffer(tamBuffer,GL_2D,@buffer);// tamBuffer - размер буфера, в исходном варианте буфер был 8000 of GLFloat GlRenderMode(GL_feedBack); size:=GlRenderMode(GL_render); {now that we got the 2D coordinates of each vertex, find which vertex is near} i:=0; try while i<size do begin If buffer[i]=GL_Pass_Through_token then {the G.P.T.T. is a marker to divide the buffer in sections} If buffer[i+1]=Entity.id then {this is the entity we are dealing with} begin inc(i,2); // continue cicling until we find another Object marker: while (buffer[i]=GL_Pass_Through_token) do begin ActualVertex:=round(Buffer[i+1]); If buffer[i+2]=GL_Polygon_Token then {this is a polygon, letґs check it out} begin count:=trunc(buffer[i+3]); inc(i,4); for j:=0 to count-1 do {letґs take a look at each vertex of this polygon} begin nx:=round(buffer[i]); {x coordinate of a vertex} ny:=round(buffer[i+1]); {y coordinate of a vertex} If (nx+radio>x) and (nx-radio<x) {radio - радиус поиска} and (ny+radio>y) and (ny-radio<y) and (NumFound<MaxHits) then begin inc(numFound); VertexHits[numFound]:=ActualVertex+j; end; inc(i,2); {x and y} end; end else inc(i,2); end; end; inc(i); end; except end; код выцарапан из юнита (для тыцанья мышей по объекту) поэтому сори если где-то непонятные буки но наскоко я понял самое важное в первых трех строках Добавлено @ 13:48 А насчет сфера, не сфера - (I)gnore ..., Пoфиг ... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |