Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2013.07.28;
Скачать: [xml.tar.bz2];

Вниз

Эффект увеличительного стекла.   Найти похожие ветки 

 
Vemer ©   (2009-01-17 23:56) [0]

Подскажите пожалуйста, в какую сторону примерно смотреть, чтобы осуществить наложение эффекта увеличительного стекла на Canvas, в котором успешно сформирована GL-сцена?
Сцена без текстур, меняется динамически.


 
KilkennyCat ©   (2009-01-18 00:00) [1]

http://www.google.ru/search?num=100&hl=ru&safe=off&client=firefox-a&rls=org.mozilla%3Aru%3Aofficial&hs=FBd&q=opengl+delphi+effects&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=lang_en|lang_ru


 
Vemer ©   (2009-01-18 00:24) [2]

Ты сам то ходил по этим ссылкам?

Мне не надо готовой программы, просто примерный порядок действий.

Щас нашел (сам а не по этой <вырезано цензурой> ссылке) у Sulaco Render To Image, буду пробовать генерить из сцены текстуру и накладывать ее на шарик.


 
KilkennyCat ©   (2009-01-18 04:41) [3]

Ходил. И находил описания алгоритмов. Но ты же вроде просил подсказать, "в какую сторону примерно смотреть"? Тогда я дал ответ более чем, нефиг капризничать и обижаться.


 
Vemer ©   (2009-01-18 10:09) [4]

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


 
{RASkov} ©   (2009-01-18 10:40) [5]

> [4] Vemer ©   (18.01.09 10:09)

Ты что кипятишься? Сам-то как видешь ответ на свой вопрос?
Ты хотел сразу решение твоей задачи что ли? или всеж в какую сторону(примерно) смотреть?


 
Б   (2009-01-18 10:51) [6]

http://algolist.manual.ru/graphics/effect/index.php
На DelphiSource.
Ещё в книге М.Краснова эффект, как обычной так и сферообразной линзы.


 
Vemer ©   (2009-01-18 12:04) [7]

Спасибо за ссылку. Краснова я читал, но там наноситься картинка на шар а не динамичное изображение. glCopyTexImage2D  вроде решает проблему.

Возможное решение (примерно то, что я хотел услышать, но нашел сам):

1. Рендерим картинку.
2. С помощью  glCopyTexImage2D генерим из нее текстуру.
3. Рисуем шарик.
4. Наносим текстуру на шарик.

Или есть более простой механизм?

Попутный вопрос - есть активные сайты-форумы где можно выкладывать - обмениваться опытом  по OpenGL-Delphi6. Просто поиск выдает кучу форумов, но регистриться на всех для проверки их работоспособности просто нереально.


 
Б   (2009-01-18 12:25) [8]

> но там наноситься картинка на шар а не динамичное изображение.

Маски пробовал?

> Попутный вопрос - есть активные сайты-форумы где можно выкладывать - > обмениваться опытом  по OpenGL-Delphi6.

http://igdc.ru/ - Здравый сайт по разработке игр именно на Delphi.
В основном пишут на OpenGL, а самое главное, что примечательно, доступны все исходники. :)

http://mirgames.ru/ - Сайт игроделов и не только.

Есть ещё много, но т.к. я на OpenGL не пишу, то и не интересуюсь.


 
Vemer ©   (2009-01-18 14:17) [9]

Спасибо, Б!


 
Омлет   (2009-01-18 20:30) [10]

Надеюсь, разберешься:

type
 TRGB = packed record
   B, G, R: Byte;
 end;
 pRGB = ^TRGB;

function ILimit(Val, AMin, AMax: Integer): Integer;
begin
 Result := Min(Max(Val, AMin), AMax);
end;

procedure Lens(Bitmap: TBitmap; xx, yy, Width, Height: Integer; Refraction: Double);

 procedure find_projected_pos(Refraction, a, b, x, y: Double; projx, projy: pDouble);
 var c, ri1, ri2, nxangle, nyangle, theta1, theta2: Double;
     n: array [0..2] of Double;
 begin
   ri1 := 1.0;
   ri2 := Refraction;
   c := DMin(a, b);
   n[0] := x;
   n[1] := y;
   n[2] := Sqrt((1 - x*x/(a*a) - y*y/(b*b))*(c*c));
   nxangle := Cos(n[0]/Sqrt(n[0]*n[0] + n[2]*n[2]));
   theta1 := PI/2 - nxangle;
   theta2 := ArcSin(Sin(theta1)*ri1/ri2);
   theta2 := PI/2 - nxangle - theta2;
   projx^ := x - Tan(theta2)*n[2];
   nyangle := ArcCos(n[1] / Sqrt(n[1]*n[1] + n[2]*n[2]));
   theta1 := PI/2 - nyangle;
   theta2 := ArcSin(Sin(theta1) * ri1/ri2);
   theta2 := PI/2 - nyangle - theta2;
   projy^ := y - Tan(theta2) * n[2];
 end;
var row, col, scol, srow,
   RegionWidth, RegionHeight, x1, y1, x2, y2: Integer;
   px1, px2: pRGB;
   dx, dy, xsqr, ysqr, a, b, asqr, bsqr, x, y: Double;
   Bmp: TBitmap;
begin
 x1 := Width div 2;
 y1 := Height div 2;
 x2 := xx + x1;
 y2 := yy + y1;
 if Refraction < 1 then Refraction := 1;
 RegionWidth := x2 - x1;
 a := RegionWidth / 2;
 RegionHeight := y2 - y1;
 b := RegionHeight / 2;
 asqr := Sqr(a);
 bsqr := Sqr(b);
 Bmp := TBitmap.Create;
 Bmp.PixelFormat := Bitmap.PixelFormat;
 Bmp.Width := RegionWidth;
 Bmp.Height := RegionHeight;
 try
   for col := 0 to RegionWidth - 1 do begin
     dx := col - a + 0.5;
     xsqr := Sqr(dx);
     for row := 0 to RegionHeight - 1 do begin
       dy := -(row - b) - 0.5;
       ysqr := Sqr(dy);
       px1 := Bmp.ScanLine[row];
       Inc(px1, col);
       if (ysqr < (bsqr - (bsqr*xsqr)/asqr)) then begin
  find_projected_pos(refraction, a, b, dx, dy, @x, @y);
         y := -y;
         srow := Trunc(y + b);
         srow := ILimit(srow, 0, Bitmap.Height - 1);
         scol := Trunc(x + a);
         scol := ILimit(scol, 0, Bitmap.Width - 1);
         px2 := Bitmap.ScanLine[y1 + srow];
         Inc(px2, x1 + scol);
         px1^ := px2^;
       end
       else begin
         px2 := Bitmap.ScanLine[y1 + row];
         Inc(px2, x1 + col);
         px1^ := px2^;
       end;
     end;
   end;
   Bitmap.Canvas.Draw(x1, y1, Bmp);
 finally
   Bmp.Free;
 end;
end;


 
Vemer ©   (2009-01-19 12:47) [11]

Ок, спасибо, поковыряюсь,, но я предпочитаю чтобы расчеты за меня OpenGL делал.



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2013.07.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
15-1360736756
DevilDevil
2013-02-13 10:25
2013.07.28
Ребят, потестите пожалуйста


15-1362568388
Хыхы
2013-03-06 15:13
2013.07.28
Как быстро скопировать массив в другой?


15-1362342603
Юрий
2013-03-04 00:30
2013.07.28
С днем рождения ! 4 марта 2013 понедельник


15-1362327330
Rouse_
2013-03-03 20:15
2013.07.28
Что такое "case study"?


15-1362398967
Kerk
2013-03-04 16:09
2013.07.28
Обход графа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский