![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenGL [WinXP]
Nikss © (2007-05-03 13:34:00)Здравствуйте! Подскажите еще, пожалуйста, как можно построить цилиндр, у меня Delphi ошибку кидает, связанную с glu.dll. И еще вопрос: если я делаю прогу под консоль, могу ли я прописать как-то там курсор, чтобы можно было объекты перетаскивать? И если да, то как это можно сделать? Заранее спасибо.
Belorus (2007-05-06 22:07:00) [1]Прости но ошибка в ДНК. Тему нужно в начинающие. К Media она явно никакого отношения не имеет.
Nikss (2007-05-06 01:43:00) [2]Я пробовал делать так:
procedure ProcessKeys;
begin
if Keys[VK_UP]
then
begin
X:=X-sin(Heading*pi/180)*FrameTime/600; // FrameTime/600=movement speed
Z:=Z+cos(Heading*pi/180)*FrameTime/600; // FrameTime/600=movement speed
HeadMovAngle:=HeadMovAngle+5;
HeadMovement:=0.008*sin(HeadMovAngle*pi/180);
end;
if Keys[VK_DOWN]
then
begin
X:=X+sin(Heading*pi/180)*FrameTime/600;
Z:=Z-cos(Heading*pi/180)*FrameTime/600;
HeadMovAngle:=HeadMovAngle-5;
HeadMovement:=0.008*sin(HeadMovAngle*pi/180);
end;
if Keys[VK_LEFT]
then
begin
X:=X+sin((Heading+90)*pi/180)*FrameTime/900; // FrameTime/900=movement speed
Z:=Z-cos((Heading+90)*pi/180)*FrameTime/900; // straffing = 50% slower
end;
if Keys[VK_RIGHT]
then
begin
X:=X-sin((Heading+90)*pi/180)*FrameTime/900;
Z:=Z+cos((Heading+90)*pi/180)*FrameTime/900;
end;
if Keys[VK_RETURN]
then
begin
LoadTex;
glDraw(0,0,0);
end;
if Keys[VK_SHIFT]
then
begin
while not Keys[VK_TAB] do;
LoadTex;
glDraw(1,mpos.x,mpos.y);
end;
end;
glDraw(1,mpos.x,mpos.y)-рисование объектов сцены.
1 - номер объекта, который перемещаем; mpos.x,mpos.y - новые координаты центра объекта.
Задумка была, чтобы нажатие shift означало, что нужно перетащить выбранный объект (в данном случае с номером 1), а при нажатии tab объект перемещался на то место, где в данный момент находится курсор. Но по-видимому, что-то не так: прога виснет. Может, подскажете, в чем ошибка?
grisme (2007-05-05 21:04:00) [3]1) есть у тебя, допустим, множество объектов. к примеру A {object1, object2, object3, ... , objectN}
2) у каждого объекта хранишь координаты(+ еще что-то что необходимо)
3) держишь переменную, которая будет обозначать какой сейчас объект выбран. например, назовем ее current_select
4) отлавливаешь нажатия клавишь(если VCL, то у формы OnKeyDown), смотришь какая клавиша нажата.
если Tab(допустим), то увеличиваем current_select на 1, если превысили N(число объектов в множестве), то current_select = 1(или 0, смотря как индексируешь) - т.е. фактически переключаем выбранный объект
если Стрелка Вверх, то A[current_select].y++
если Стрелка Вниз, то A[current_select].y--
если Стрелка Влево, то A[current_select].x--
если Стрелка Вправо, то A[current_select].x++
5) рендер всех объектов из A по их координатам.
для интересности, можно, к примеру сделать выбираемыми группу объектов(дополнительное множество с индексами выбранных объектов) и при изменении координат(отлов стрелок) - пробегацо по этому множеству и изменять координаты всех объектов, чьи индексы вошли в множество.
еще можно при рендере красить выбранный объект другим цветом... ну это я все - зафантазировался... %-) и т.д. в общем, все явно - ничего сложного нету
Nikss (2007-05-05 13:06:00) [4]Дело в том, что я в OpenGL новичок, а работу сделать позарез надо (курсовик). Поэтому если кто-нибудь может помочь хоть каким-нибудь примерным кодом (хотя бы схематично), буду премного благодарен.
grisme (2007-05-05 03:57:00) [5]>А есть ли какой-нибудь способ, как организовать возможность >перемещения имеющихся объектов не при помощи мышки, а с помощью клавиатуры?
Есть. Сделать селектор, переключаемый между объектами, на ком селектор установлен, у того меняем координаты, отлавливая, к примеру, клавиши стрелочек
Nikss (2007-05-04 19:15:00) [6]А есть ли какой-нибудь способ, как организовать возможность перемещения имеющихся объектов не при помощи мышки, а с помощью клавиатуры? Хотелось бы все-таки консольку оставить.
Rial (2007-05-03 20:04:00) [7]Извини, немного не то скопи-пастил :)
Там не хватает
procedure Line(Const X1, Y1, Z1, X2, Y2, Z2 : GLFloat);
Var X, Y, R : GLFloat;
begin
Y :=(X2 - X1) / 2.0;
X :=(Y2 - Y1) / 2.0;
R :=FLineWidth / Hypot(X, Y);
Y :=Y * R;
X :=X * R;
glBegin(GL_Triangles);
glVertex3f(X2 - X, Y2 + Y, Z2);
glVertex3f(X1 - X, Y1 + Y, Z1);
glVertex3f(X1 + X, Y1 - Y, Z1);
glVertex3f(X2 - X, Y2 + Y, Z2);
glVertex3f(X1 + X, Y1 - Y, Z1);
glVertex3f(X2 + X, Y2 - Y, Z2);
glEnd;
end;
А вообще там окружность. Круг рисуется примерно как то так:
procedure Point(Const X, Y, Z : GLFloat);
Var Sn, Cs, A : Extended;
I : integer;
begin
glNormal3fv(@DefaultNormal);
A :=TwoPi / Det;
glBegin(GL_Triangle_Fan);
glVertex3f(X, Y, Z);
For I :=0 to Det do begin
SinCos(A * I, Sn, Cs);
glVertex3f(X + Cs * FPointSize, Y + Sn * FPointSize, Z);
end;
glEnd;
end;
Rial (2007-05-03 20:02:00) [8]1.
> мне нужно, чтобы объекты, которые есть в комнате, можно
> было перемещать. Для этих целей хотелось бы прописать мышку.
ЛОЛ.
Что такое "прописать мышку" ?
И вообще, какая связь между мышкой и объектами ?..
Тут тебе многое придется изучить, прежде чем такое сделать,
простого ответа нет.
Советую от консоли таки отказаться, если я тебя вообще правильно понял.
Объекты выбирать есть много способов. В книге Краснова из соседней
ветки предлагаются 2 или 3.
2.
procedure Circle(Const Radius : GLFloat; Const XD : Integer);
Var I : Integer;
X, Y, bX, bY : GLFloat;
Sn, Cs : Extended;
begin
bX :=Radius;
bY :=0.0;
SinCos(TwoPi / XD, Sn, Cs);
For I :=0 to XD do begin
PerformCoords(bX, bY, Cs, Sn, X, Y);
Line(bX, bY, 0.0, X, Y, 0.0);
bX :=X;
bY :=Y;
end;
end;
procedure PerformCoords(Const X, Y, Cs, Sn : GLFloat; Var OutX, OutY : GLFloat);
begin
OutX :=X * Cs - Y * Sn;
OutY :=Y * Cs + X * Sn;
end;
Вот так можно нарисовать круг.
Изучи и постарайся сделать выводы, как нарисовать циллиндр.
Nikss (2007-05-03 19:54:00) [9]Че-то я не догоняю с треугольниками... Как это возможно? А по поводу мышки - мне нужно, чтобы объекты, которые есть в комнате, можно было перемещать. Для этих целей хотелось бы прописать мышку.
Rial (2007-05-03 19:26:00) [10]> если я делаю прогу под консоль, могу ли я прописать как-
> то там курсор, чтобы можно было объекты перетаскивать
бррр! :) переведи попроще как- нибудь ?
> как можно построить цилиндр
Строй из треугольников сам.
Выбираешь степень детализации для оснований,
с этой точностью рассчитываешь точки многоугольника.
Теперь по полученным точкам строишь прямоугольники
между верхней и нижней плоскостями.