Форум: "Media";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];
ВнизOpenGL Найти похожие ветки
← →
Nikss (2007-05-03 13:34) [0]Здравствуйте! Подскажите еще, пожалуйста, как можно построить цилиндр, у меня Delphi ошибку кидает, связанную с glu.dll. И еще вопрос: если я делаю прогу под консоль, могу ли я прописать как-то там курсор, чтобы можно было объекты перетаскивать? И если да, то как это можно сделать? Заранее спасибо.
← →
Rial © (2007-05-03 19:26) [1]> если я делаю прогу под консоль, могу ли я прописать как-
> то там курсор, чтобы можно было объекты перетаскивать
бррр! :) переведи попроще как- нибудь ?
> как можно построить цилиндр
Строй из треугольников сам.
Выбираешь степень детализации для оснований,
с этой точностью рассчитываешь точки многоугольника.
Теперь по полученным точкам строишь прямоугольники
между верхней и нижней плоскостями.
← →
Nikss (2007-05-03 19:54) [2]Че-то я не догоняю с треугольниками... Как это возможно? А по поводу мышки - мне нужно, чтобы объекты, которые есть в комнате, можно было перемещать. Для этих целей хотелось бы прописать мышку.
← →
Rial © (2007-05-03 20:02) [3]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;
Вот так можно нарисовать круг.
Изучи и постарайся сделать выводы, как нарисовать циллиндр.
← →
Rial © (2007-05-03 20:04) [4]Извини, немного не то скопи-пастил :)
Там не хватает
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;
← →
Nikss (2007-05-04 19:15) [5]А есть ли какой-нибудь способ, как организовать возможность перемещения имеющихся объектов не при помощи мышки, а с помощью клавиатуры? Хотелось бы все-таки консольку оставить.
← →
grisme © (2007-05-05 03:57) [6]>А есть ли какой-нибудь способ, как организовать возможность >перемещения имеющихся объектов не при помощи мышки, а с помощью клавиатуры?
Есть. Сделать селектор, переключаемый между объектами, на ком селектор установлен, у того меняем координаты, отлавливая, к примеру, клавиши стрелочек
← →
Nikss (2007-05-05 13:06) [7]Дело в том, что я в OpenGL новичок, а работу сделать позарез надо (курсовик). Поэтому если кто-нибудь может помочь хоть каким-нибудь примерным кодом (хотя бы схематично), буду премного благодарен.
← →
grisme © (2007-05-05 21:04) [8]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-06 01:43) [9]Я пробовал делать так:
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 объект перемещался на то место, где в данный момент находится курсор. Но по-видимому, что-то не так: прога виснет. Может, подскажете, в чем ошибка?
← →
Belorus © (2007-05-06 22:07) [10]Прости но ошибка в ДНК. Тему нужно в начинающие. К Media она явно никакого отношения не имеет.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c