![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нахождение высоты в заданной точке [Delphi, OpenGL]
Ricks © (2005-09-13 23:59:00)У меня вот такая проблема:
Пусть функция f(x, z) задает высоту поверхности в узловых точкач (те x и z - целые, от 1 до n). Задача состоит в определении высоты поверхности в ЛЮБОЙ точке (те например т.M(X:0.76; Z:0.789) )
Помогите!
NE_Parovoz (2005-09-20 16:11:00) [1]Ricks, нужны именно углы?, может сразу матрицу находить, из нормали
а XTropper, всетаки посмотри(если необязательно углы);
A22 (2005-09-20 12:13:00) [2]Ricks, alpha - угол. Тебе нужно два угла - относителньо оси X и Z? тогда придется считать 2 отношения:
delta_y/delta_x, и delta_y/delta_z
в общем, это планиметрия школьная, класс за 9 максимум. подумай немного, нарисуй все на бумаге, приятно же самому решить задачу от начала до конца
XProger (2005-09-20 01:17:00) [3]Ricks, в разделе скачать видимо...
Ricks (2005-09-19 22:53:00) [4]> A22
tg(alpha) = b/a
что такое alpha???
Мне нужны 2 угла (по x и z)
> XProger
сайт, не спорю, хороший, но где там искать я не знаю...
A22 (2005-09-19 17:36:00) [5]2 Ricks
наоборот катеты, очепятался, сорри
а XTropper принципиально не смотри - заколебал! :)
XProger (2005-09-19 16:34:00) [6]XTropper ( http://XProger.mirgames.ru)
Высчитываются углы наклона пауков и пушек на поверхности ландшафта
A22 (2005-09-19 16:08:00) [7]tg(alpha) = b/a, где a - длина противолежащего катета, b - прилежащего
в чем проблема-то? :)
Ricks (2005-09-14 02:17:00) [8]Спасибо огромное! Помогло!!
Только теперь возникла еще одна проблемма: наклон объекта (по 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;
Кефир87 (2005-09-14 01:54:00) [9]Вообще эту функцию мне в свое время помогли создать в этой ветке. Поищи тему "Простейшая линейная интерполяция" 8)
Ricks (2005-09-14 01:11:00) [10]Спасибо, буду разбираться!
Кефир87 (2005-09-14 00:17:00) [11]Вот попробуй разберись. 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;