Конференция "Media" » Эффект увеличительного стекла. [D6, D7, WinXP]
 
  • Vemer © (17.01.09 23:56) [0]
    Подскажите пожалуйста, в какую сторону примерно смотреть, чтобы осуществить наложение эффекта увеличительного стекла на Canvas, в котором успешно сформирована GL-сцена?
    Сцена без текстур, меняется динамически.
  • KilkennyCat © (18.01.09 00:00) [1]
  • Vemer © (18.01.09 00:24) [2]
    Ты сам то ходил по этим ссылкам?

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

    Щас нашел (сам а не по этой <вырезано цензурой> ссылке) у Sulaco Render To Image, буду пробовать генерить из сцены текстуру и накладывать ее на шарик.
  • KilkennyCat © (18.01.09 04:41) [3]
    Ходил. И находил описания алгоритмов. Но ты же вроде просил подсказать, "в какую сторону примерно смотреть"? Тогда я дал ответ более чем, нефиг капризничать и обижаться.
  • Vemer © (18.01.09 10:09) [4]
    Тебе похоже проще писать отповеди и корчить крутого перца, чем написать пару слов по порядок действий, возможно сообщение получилось бы короче. Ну что же, у всех свои приоритеты. Только это не очень конструктивно.
  • {RASkov} © (18.01.09 10:40) [5]
    > [4] Vemer ©   (18.01.09 10:09)

    Ты что кипятишься? Сам-то как видешь ответ на свой вопрос?
    Ты хотел сразу решение твоей задачи что ли? или всеж в какую сторону(примерно) смотреть?
  • Б (18.01.09 10:51) [6]
    http://algolist.manual.ru/graphics/effect/index.php
    На DelphiSource.
    Ещё в книге М.Краснова эффект, как обычной так и сферообразной линзы.
  • Vemer © (18.01.09 12:04) [7]
    Спасибо за ссылку. Краснова я читал, но там наноситься картинка на шар а не динамичное изображение. glCopyTexImage2D  вроде решает проблему.

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

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

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

    Попутный вопрос - есть активные сайты-форумы где можно выкладывать - обмениваться опытом  по OpenGL-Delphi6. Просто поиск выдает кучу форумов, но регистриться на всех для проверки их работоспособности просто нереально.
  • Б (18.01.09 12:25) [8]
    > но там наноситься картинка на шар а не динамичное изображение.

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

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

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

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

    Есть ещё много, но т.к. я на OpenGL не пишу, то и не интересуюсь.
  • Vemer © (18.01.09 14:17) [9]
    Спасибо, Б!
  • Омлет (18.01.09 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 © (19.01.09 12:47) [11]
    Ок, спасибо, поковыряюсь,, но я предпочитаю чтобы расчеты за меня OpenGL делал.
 
Конференция "Media" » Эффект увеличительного стекла. [D6, D7, WinXP]
Есть новые Нет новых   [134464   +62][b:0][p:0.002]