Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
2-1206008011
Sedd
2008-03-20 13:13
2008.04.13
Нужен совет


15-1204054285
WondeRu
2008-02-26 22:31
2008.04.13
Аппаратная проблема


15-1203995117
Светик
2008-02-26 06:05
2008.04.13
Ошибка CRC


15-1203955152
Ega23
2008-02-25 18:59
2008.04.13
Есть ли в PHP5 аналог forward?


2-1205914781
Kavis
2008-03-19 11:19
2008.04.13
Delphi 10 Lite значение переменной по наведению мыши





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