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

Вниз

Нахождение высоты в заданной точке   Найти похожие ветки 

 
Ricks ©   (2005-09-13 23:59) [0]

У меня вот такая проблема:
Пусть функция f(x, z) задает высоту поверхности в узловых точкач (те x и z - целые, от 1 до n). Задача состоит в определении высоты поверхности в ЛЮБОЙ точке (те например т.M(X:0.76; Z:0.789) )
Помогите!


 
Кефир87 ©   (2005-09-14 00:17) [1]

Вот попробуй разберись. 8) Узлы у меня в матрице height[0..n1, 0..n2]... Вместо y можно указать z...
function TLand.GetHeight(x,y:GLfloat):GLfloat;
 function Lerp( a, b, t: Single ): Single;
 begin
   Result := ( 1 - t ) * a + t * b;
 end;

var
 sx,sy:GLfloat;
 tx,tz:GLfloat;
 ya, yb,y0,y1,y2,y3:GLfloat;
 x0,x1,x2,x3, z0,z1,z2,z3:integer;
begin
 if(x>0)and(y>0)and(x<info.mWidth)and(y<info.mHeight)then
 begin
   x0 := trunc(x);
   x1 := trunc(x)+1;
   x2 := x0;
   x3 := x1;

   z0 := trunc(y);
   z1 := z0;
   z2 := trunc(y)+1;
   z3 := z2;

   y0 := heihts[trunc(x), trunc(y)];
   y1 := heihts[trunc(x)+1, trunc(y)];
   y2 := heihts[trunc(x), trunc(y)+1];
   y3 := heihts[trunc(x)+1, trunc(y)+1];

   tx := ( x - x0 ) / ( x1 - x0 );
   ya := Lerp( y0, y1, tx );
   yb := Lerp( y2, y3, tx );

   tz := ( y - z0 ) / ( z2 - z0 );
   Result := Lerp( ya, yb, tz );

   {glMatrixMode(GL_MODELVIEW);
   glPushMatrix;
   glLoadIdentity;
   glBegin(GL_POINT_BIT);
     glvertex3f(trunc(x)*cell_width,              heihts[trunc(x),trunc(y)]+0.01,     trunc(y)*cell_width);
     glvertex3f(trunc(x)*cell_width + cell_width, heihts[trunc(x)+1,trunc(y)]+0.01,   trunc(y)*cell_width);
     glVertex3f(trunc(x)*cell_width + cell_width, heihts[trunc(x)+1,trunc(y)+1]+0.01, trunc(y)*cell_width+cell_width);
     glVertex3f(trunc(x)*cell_width,              heihts[trunc(x),trunc(y)+1]+0.01,   trunc(y)*cell_width+cell_width);
   glEnd;

   glBegin(GL_LINES);
     glVertex3f(x-cell_width/2, 0.01, y);
     glVertex3f(x+cell_width/2, 0.01, y);

     glVertex3f(x, Result+0.01, y-cell_width/2);
     glVertex3f(x, Result+0.01, y+cell_width/2);
   glEnd;

   glPopMatrix;    }
 end else Result := 0.0;
end;


 
Ricks ©   (2005-09-14 01:11) [2]

Спасибо, буду разбираться!


 
Кефир87 ©   (2005-09-14 01:54) [3]

Вообще эту функцию мне в свое время помогли создать в этой ветке. Поищи тему "Простейшая линейная интерполяция" 8)


 
Ricks ©   (2005-09-14 02:17) [4]

Спасибо огромное! Помогло!!
Только теперь возникла еще одна проблемма: наклон объекта (по x и z). Как получить соответствующие углы наклона. Я попытался, но у меня что-то не очень получилось. Вот код:


function TBasicUnit.ForwardPos;
begin
Result:=Vector( Center.X + cosex( angle.Y ) * MoveSpeed, 0, Center.Z - sinex( angle.Y ) * MoveSpeed );
Result.Y:=GetAHeight( Result.X, Result.Z )
end;

function TBasicUnit.SidePos;
begin
Result:=CrossVector( Vector( Center.X + cosex( angle.Y ) * MoveSpeed, 0, Center.Z - sinex( angle.Y ) * MoveSpeed ), Vector(0, 1, 0));
Result.Y:=GetAHeight( Result.X, Result.Z );
end;

// вот здесь!
procedure TBasicUnit.UpdateHeight;
var f : TVector;
begin
Center.Y:=GetAHeight( Center.X, Center.Z );
f:=ForwardPos; angle.z:=(f.y - center.y) / DistancePoints(f, center) * 180 / pi;
f:=SidePos;    angle.x:=(f.y - center.y) / DistancePoints(f, center) * 180 / pi;
end;


 
A22 ©   (2005-09-19 16:08) [5]

tg(alpha) = b/a, где a - длина противолежащего катета, b - прилежащего
в чем проблема-то? :)


 
XProger ©   (2005-09-19 16:34) [6]

XTropper (http://XProger.mirgames.ru)
Высчитываются углы наклона пауков и пушек на поверхности ландшафта


 
A22 ©   (2005-09-19 17:36) [7]

2 Ricks
наоборот катеты, очепятался, сорри
а XTropper принципиально не смотри - заколебал! :)


 
Ricks ©   (2005-09-19 22:53) [8]

> A22
tg(alpha) = b/a
что такое alpha???
Мне нужны 2 угла (по x и z)

> XProger
сайт, не спорю, хороший, но где там искать я не знаю...


 
XProger ©   (2005-09-20 01:17) [9]

Ricks, в разделе скачать видимо...


 
A22 ©   (2005-09-20 12:13) [10]

Ricks, alpha - угол. Тебе нужно два угла - относителньо оси X и Z? тогда придется считать 2 отношения:
delta_y/delta_x, и delta_y/delta_z

в общем, это планиметрия школьная, класс за 9 максимум. подумай немного, нарисуй все на бумаге, приятно же самому решить задачу от начала до конца


 
NE_Parovoz ©   (2005-09-20 16:11) [11]

Ricks, нужны именно углы?, может сразу матрицу находить, из нормали
а XTropper, всетаки посмотри(если необязательно углы);



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

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

Наверх





Память: 0.48 MB
Время: 0.04 c
1-1140796690
Belorus
2006-02-24 18:58
2006.04.02
Загрузка памяти программой


15-1141772366
**Сергей**
2006-03-08 01:59
2006.04.02
Радиокомпоненты


2-1142586275
ilga
2006-03-17 12:04
2006.04.02
ADOQuery.Parameters


2-1142952153
DelphiLexx
2006-03-21 17:42
2006.04.02
CutToClipboard


15-1141746878
Pazitron_Brain
2006-03-07 18:54
2006.04.02
В чем проблема?





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