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

Вниз

поворот спрайта (програмно)   Найти похожие ветки 

 
TButton ©   (2005-10-25 02:30) [0]

не совсем уверен, что знаю как реализовать сабж
для реализации не исползуется ни DX, ни OGL
просто софтварно
моё предположение
нужно вычислять полярные координаты кадого поворачиваемого пиксела
относительно точки поворота,
изменять угол на угол поворота
и выводить пиксель
но, боюсь появления гапов
(дырок в которую не попал ни один пиксель)

есть другие варианты (алгоритмы)?


 
Antonn ©   (2005-10-25 06:20) [1]

сам мучался, вот глянь то, что получилось:
http://kladovka.net.ru/index.cgi?pid=list&rid=252


 
JUS   (2005-10-25 06:32) [2]

Ща заценю.

А я вот панель сегодня до утра аж рисовал в Corel"е часов пять. Всё придумывал как что разместить, кое как закончил. Нарисовал красиво, аж неверится самому что это я сам нарисовал, самому нравится.


 
JUS   (2005-10-25 06:35) [3]

Круто


 
JUS   (2005-10-25 06:50) [4]

А я вот панель сегодня до утра аж рисовал в Corel"е часов пять. Всё придумывал как что разместить, кое как закончил. Нарисовал красиво, аж неверится самому что это я сам нарисовал, самому нравится.

это я веткой ошибся, сорри!


 
TButton ©   (2005-10-25 13:24) [5]


> сам мучался, вот глянь то, что получилось:

я из тех, кто
> идут лесом:)
код поворота вообще никак не откоментирован
все в перемешку
в принципе
у меня всё работает
минус один - гапы...
попробовал увеличить дискретизацию вдвое
пока не помогло
гапы сменились глюками =)


 
MBo ©   (2005-10-25 14:27) [6]

>минус один - гапы...
Для избавления от них - делай обратное маппирование - т.е. для каждой точке новой картинки находи соотв. точку исходной.

Полярные координаты - не нужны, лишняя работа.

XOld = XCenter + (XNew-XCenter)*Cos(fi) - (YNew-YCenter)*Sin(fi)
YNew=YCenter +  (XNew-XCenter)*Sin(fi) + (YNew-YCenter)*Cos(fi)


 
MBo ©   (2005-10-25 14:31) [7]

Во второй строчке слева - YOld


 
TButton ©   (2005-10-26 00:53) [8]

2 MBo
хм... я уже полярными замутил
починил я таки глюк с повышением частоты дискретизации
теперь каждый пиксель отрисовывается 4 раза
гапов нет, но потеря в скорости чувствуется

просто у меня модуль для работы с направлениями и расстояниями без дела валялся =)
> XOld = XCenter + (XNew-XCenter)*Cos(fi) - (YNew-YCenter)*Sin(fi)
> YNew=YCenter +  (XNew-XCenter)*Sin(fi) + (YNew-YCenter)*Cos(fi)
а прямое без полярных как выглядит?
или достаточно ограничиться этим, обозначив зону поиска как окружность с радиусом равным половине диагонали спрайта?


 
MBo ©   (2005-10-26 07:33) [9]

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


 
TButton ©   (2005-10-26 14:52) [10]


> Из этих же формул можно выразить.

и действительно...
что-то я протупил с утра по-раньше


 
Zer0 ©   (2005-10-28 02:38) [11]

извращенцы блин. гуглить софтверную отрисовку (растеризацию) затекстуреных треугольников или rotozoom
ускорение по сравнению с предложенными вариантами на порядок


 
TButton ©   (2005-10-28 04:39) [12]


> извращенцы блин. гуглить софтверную отрисовку (растеризацию)
> затекстуреных треугольников или rotozoom
> ускорение по сравнению с предложенными вариантами на порядок

3Д отсутствует напрочь
физически отсутствует
двиган ориентирован на чисто софтверный просчёт
и пиксельную графику


 
TButton ©   (2005-10-28 04:56) [13]

2 MBo
нифига не выйдет
для вычисления XNew мне понадобится YNew
и наоборот...


 
MBo ©   (2005-10-28 06:55) [14]

>TButton ©   (28.10.05 04:56) [13]
Еще раз повторю - обратное маппирование эффективнее, бесплатно избавляет от дырок.

А для прямого, если все же очень хочется -

XNew = XCenter + (XOld-XCenter)*Cos(fi) + (YOld-YCenter)*Sin(fi)
YNew=YCenter  -  (XOld-XCenter)*Sin(fi) + (YOld-YCenter)*Cos(fi)

Это фактически умножение исходного вектора (в однородных координатах)
(XOld, YOld, 1) на произведение матриц афинного преобразования -переноса, поворота, и обратного переноса


 
TButton ©   (2005-10-28 08:17) [15]


> на произведение матриц афинного преобразования -переноса,
>  поворота, и обратного переноса

я технарь, с высшей математикой - напряг
но в общих чертах понял =)
просто у нас ещё раньше возникло непонимание
я понял твой пост, как
необходимость дополнять прямое мапирование обратным =)


 
MBo ©   (2005-10-28 08:28) [16]

>я понял твой пост, как
необходимость дополнять прямое мапирование обратным =)

Ну теперь разобрался, что прямое вообще не нужно?

Пример, правда, усложненный, есть в статье:
http://www.delphimaster.ru/articles/pixels/index.html


 
TButton ©   (2005-10-29 01:10) [17]


> Ну теперь разобрался, что прямое вообще не нужно?

да =) ещё раз спасибо =)
> http://www.delphimaster.ru/articles/pixels/index.html

собсна с этого я и начинал =)


 
Fenik ©   (2005-10-30 00:38) [18]

> TButton ©

посмотри это
http://delphimaster.net/view/9-1129046372/


 
Antonn ©   (2005-10-30 06:05) [19]

или вот, "очеловеченая" процедурка из модуля(пост [1])
_SourceBitmap - поворачиываемый спрайт
_DestBitmap - битмап вывода
_x,_y - координаты левого верхнего угла выводимого спрайта на _DestBitmap
centerX,centerY - точка поворота(можно и не только относительно центра) _SourceBitmap
transparentColor - "прозрачный цвет"
_angle - угол поворота в радианах

procedure CopyRotateTransparentBitmap(_SourceBitmap,_DestBitmap: TBitmap; _x,_y,centerX,centerY:integer; transparentColor:Tcolor; _angle: Double);
const Pixels = MaxInt div SizeOf(TRGBTriple);
type PRGBArray = ^TRGBArray;
TRGBArray = array[0..Pixels-1] of TRGBTriple;
var cosRadians,sinRadians : Double;
x,y,x_cor,y_cor,x_corS,y_corS,inXOut,inXPr,inXRotated,inYOut,inYPr,inYRotated: Integer;
RowOut, RowIn: PRGBArray;
rc1, bc1, gc1:byte;
begin
if (_x)> _DestBitmap.Width-1 then exit; if (_x+_DestBitmap.Width)< 0 then exit;   //проверки на "вхождение" хоть части вращаемого битмапа в выводимый
if (_y)> _DestBitmap.Height-1 then exit; if (_y+_DestBitmap.Height)< 0 then exit;

_SourceBitmap.PixelFormat:=pf24bit; //убрать, если изначально этот формат
_DestBitmap.PixelFormat:=pf24bit;  //убрать, если изначально этот формат

sinRadians:=Sin(_angle);
cosRadians:=Cos(_angle);

if _x < 0 then x_corS:=abs(_x) else x_corS:=0;  //находим TRect исходного битмапа, который будет выводится,
if _y < 0 then y_corS:=abs(_y) else y_corS:=0;  //на тот случай, если выводим вращающийся битмап скраю на выводимый
if (_x+_SourceBitmap.Width)> _DestBitmap.Width then x_cor:=_x+_SourceBitmap.Width-_DestBitmap.Width else x_cor:=0;
if (_y+_SourceBitmap.Height)> _DestBitmap.Height then y_cor:=_y+_SourceBitmap.Height-_DestBitmap.Height else y_cor:=0;

rc1:=GetRValue(transparentColor);  //цвет прозрачности, не копируется
gc1:=GetGValue(transparentColor);
bc1:=GetBValue(transparentColor);

for x:=_SourceBitmap.Height-1-y_cor downto y_corS do begin
RowIn:=_SourceBitmap.Scanline[x+_y];
inXPr:=2*(x-centerY)+1;
for y:=_SourceBitmap.Width-1-x_cor downto x_corS do begin
inYPr:=2*(y-centerX)+1;

inYRotated:=Round(inYPr*CosRadians-inXPr*sinRadians);
inXRotated:=Round(inYPr*sinRadians+inXPr*cosRadians);

inYOut:=(inYRotated-1) div 2 + centerX;
inXOut:=(inXRotated-1) div 2 + centerY;

if (inYOut >=0)and(inYOut <=_SourceBitmap.Width-1)and(inXOut >=0)and(inXOut <=_SourceBitmap.Height-1) then begin

RowOut:=_SourceBitmap.Scanline[inXOut];
if not((RowOut[inYOut].rgbtRed=rc1)and(RowOut[inYOut].rgbtGreen=gc1)and(RowOut[inYOut].rgbtBlue=bc1)) then
RowIn[y+_x] := RowOut[inYOut];
end;
end;
end;
end;


 
OSokin ©   (2005-11-01 18:33) [20]

procedure DrawRotated(DC: HDC; Bitmap: HBitmap; X, Y: Integer; Angle: Real);
var
 TempDC: HDC;
 BmpSize: SIZE;
 t: Real;
 Points: Array[0..2] of TPoint;
 Xc, Yc: integer;
begin
 TempDC := CreateCompatibleDC(DC);
 SelectObject(TempDC, Bitmap);
 GetBitmapDimensionEx(Bitmap, BmpSize);

 Xc := X + (BmpSize.cX div 2); //I"a`o~i^a"e`i` o"a*i"o`?
 Yc := Y + (BmpSize.cY div 2);

 t := Angle * 0.0174533;

 Points[0].X := Round((X - Xc) * cos(t) - (Y - Yc) * sin(t) + Xc);
 Points[0].Y := Round((Y - Yc) * cos(t) + (X - Xc) * sin(t) + Yc);

 Points[1].X := Round((X + BmpSize.cX - Xc) * cos(t) - (Y - Yc) * sin(t) + Xc);
 Points[1].Y := Round((Y - Yc) * cos(t) + (X + BmpSize.cX - Xc) * sin(t) + Yc);

 Points[2].X := Round((X - Xc) * cos(t) - (Y + BmpSize.cY - Yc) * sin(t) + Xc);
 Points[2].Y := Round((Y + BmpSize.cY - Yc) * cos(t) + (X - Xc) * sin(t) + Yc);

 PlgBlt(DC, Points, TempDC, 0, 0, BmpSize.cX, BmpSize.cY, 0, 0, 0);
 DeleteDC(TempDC);
end;



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

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

Наверх




Память: 0.53 MB
Время: 0.012 c
3-1144592150
DevilDevil
2006-04-09 18:15
2006.05.28
Как корректно сохранить/изменить таблицу


3-1144132053
RomanH
2006-04-04 10:27
2006.05.28
Автоинкремент в MSSQL


2-1147146790
mctarik
2006-05-09 07:53
2006.05.28
Как выполнить AutoCheck всех пунктов MainMenu!


15-1146399937
Pazitron_Brain
2006-04-30 16:25
2006.05.28
Серьезные люди


1-1145659505
gear
2006-04-22 02:45
2006.05.28
Теряется StayOnTop у формы.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский