Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.07.28;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2013.07.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
3-1291295803
svb
2010-12-02 16:16
2013.07.28
Одна таблица или много маленьких


2-1354195227
ankazh
2012-11-29 17:20
2013.07.28
RichEdit и БД


15-1362601803
Юрий
2013-03-07 00:30
2013.07.28
С днем рождения ! 7 марта 2013 четверг


2-1354073820
Abcdef123
2012-11-28 07:37
2013.07.28
Как объявить свойство с дополнительным параметром?


3-1291630604
DOA User
2010-12-06 13:16
2013.07.28
Проблема с вставкой/редактированием записей в TOracleDataSet