PDA

Просмотр полной версии : координаты


mira
21.01.2011, 13:42
вопрос о5же к адвансед мемберам. Вот такая ситуация-
имеем координаты начальные и конечные плюс скорость. У меня чет лажа выходит.
Вычисляю расстояние. Затем t : speed * dist.
Время получаетса в секундах.
Пытаюсь привескти к мс t: t*1000.
Запоминаю время прихода мувтулокейшн

Добавлено через 3 минуты
пытаюсь узнать текущую коорд при беге. Узнаю текущее время в мс. Вычисляю коэфицент от начального времени и им интерполирую координаты начала и конца. Получаетса дикая погрешность

supernewbie
21.01.2011, 15:06
vx=(dx / dist) / 1000 - вектор по х движения в 1 мс
vy=(dy / dist) / 1000 - вектор по y движения в 1 мс
дальше узнаешь сколько времени прошло, dt=time_now-time_start (в мс),
и... start_x+(dt*vx), start_y+(dt*vy)
PS вполне возможно что ничерта не будет работать :D

mira
21.01.2011, 16:33
хм. А где тут учет скорости бега?

supernewbie
21.01.2011, 16:39
ах да, точна..
vx=(dx / (dist / speed)) / 1000

xkor
21.01.2011, 18:18
mira, ты наверно не учитываешь что скорость это не только параметр speed из пакета с описание чара или нпц, speed надо ещё умножить на speedmultipler из того же пакета)

mira
22.01.2011, 02:29
mira, ты наверно не учитываешь что скорость это не только параметр speed из пакета с описание чара или нпц, speed надо ещё умножить на speedmultipler из того же пакета)

ясен пень что спид у меня это спид из пакета умноженый на мультиплер)

Добавлено через 21 минуту
ах да, точна..
vx=(dx / (dist / speed)) / 1000

щас попробую этот метод расчета

Добавлено через 17 минут
болт. тоже самое тока + еще твинк мечетса
щас у меня так:

procedure L2GetNewPos(pobj:PL2CreatureData;var v: TL2Vector);
var
sdiff:SINGLE;
ticks:DWORD;
begin
ticks:=GetTickCount; // текущее время
// если текущее время больше время заврежения бега то считаем
// что мы дошли и возвращаем конечную координату
if pobj.endmovetime<=ticks then begin
pobj.inMovef:=false;
v:=pobj.endpoint;
exit;
end;
//вычисляем коэффицент из того время что отведено и того что прошло
sdiff:=abs((pobj.endmovetime-ticks)/pobj.movetime);
//на всяк смотрим чтоб оно не вышло за пределы
if sdiff>1.0 then sdiff:=1.0;
//вычисляем координату интерполируя конечную и начальную точки
L2VectorInterpolate(pobj.startpos,pobj.endpoint,sd iff,v);
end;


Добавлено через 7 часов 4 минуты

procedure L2VectorInterpolate(const v1,v2: TL2Vector; v:single; var vout:TL2Vector);
begin
vout.x:=trunc((v*(v1.x-v2.x)) + v2.x);
vout.y:=trunc((v*(v1.y-v2.y)) + v2.y);
vout.z:=trunc((v*(v1.z-v2.z)) + v2.z);
end;


Добавлено через 22 минуты
следование

function TL2Controller.fsTraceObjectNew(var v: variant): variant;
var
v1,v2:TL2Vector;
targetID : integer;
dist:integer;
tvnew : TL2Vector;
tmypoint : TD3DVector;
x2,y2,z2:integer;
mX,mY,mZ:integer;
sina,cosa : single;
mdist : integer;
begin
result:=boolean(false);
if WaitForSingleObject(TL2C.hevent,200)<>WAIT_TIMEOUT then exit;
if assigned(nhandler.mychar)then if nhandler.mychar.isDead then exit;
if isInBadEffect then exit;
if nhandler.mychar=nil then begin
//IDirect3DDevice9H(idev_).StrWrite('current char not accessible');
exit;
end;
targetID:=v[0];
if targetID=0 then begin
IDirect3DDevice9H(idev_).StrWrite('Empty trace target',$FF5555);
exit;
end;

if not nhandler.GetObjectPos(v1,targetID)then begin
IDirect3DDevice9H(idev_).StrWrite('trace target not accessible',$FF5555);
exit;
end;

if L2IsInMove(nhandler.mychar)and not(boolean(v[1])) then begin
v1.z:=0;
if L2VectorDist(v1,PrevTraceCoord)<50 then exit; // NEWKE
//nhandler.unlock; // none pos update
//exit;
end;

if not nhandler.GetObjectPos(v2,nhandler.GetMyID)then begin
IDirect3DDevice9H(idev_).StrWrite('mychar not accessible',$FF5555);
exit;
end;

x2:=(v1.x-v2.x);
y2:=(v1.y-v2.y);
Z2:=(v1.Z-v2.Z);

mX:=1;mY:=1;mZ:=1;
if (x2<0) then begin mX:=-1; x2:=x2*(-1);end;
if (y2<0) then begin mY:=-1; y2:=y2*(-1);end;
if (z2<0) then begin mZ:=-1; z2:=z2*(-1);end;

dist:=trunc(L2VectorDist(v1,v2));

if dist<v[2] then begin // distantion is small
exit;
end;

cosa:=(x2)/dist;
sina:=(y2)/dist;
mdist:= dist-100;
//if dist<100 then mdist:=1;
tvnew.x:=trunc(mdist*cosa);
tvnew.y:=trunc(mdist*sina);
tvnew.x:=v2.x+(tvnew.x * mX);
tvnew.y:=v2.y+(tvnew.y * mY);
tvnew.z:=v2.z;

//tvnew.x:=tvnew.x+(Random(20)-10);
// tvnew.y:=tvnew.y+(Random(20)-10);
dist:=trunc(L2VectorDist(v1,tvnew));
if dist<100 then exit;

nhandler.MoveBackwardToLocation(tvnew.x,tvnew.y,tv new.z);
PrevTraceCoord.x:=v1.x;
PrevTraceCoord.y:=v1.y;
PrevTraceCoord.z:=0;
//IDirect3DDevice9H(idev_).StrWrite('trace by dist : '+inttostr(dist));
result:=boolean(true);
end;