Форум: "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