Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2009, 15:05   #1
kady
 
Регистрация: 08.11.2009
Сообщений: 7
По умолчанию проблема с рисованием сферы

День добрый,
задаю как и полагается студенту-идиоту наитупейший вопрос - как рисовать сферу в openGL под Delphy? ))
Точнее что для этого нужно я, вроде знаю,
Код:
  
 gluQuadricDrawStyle(Quadric, GLU_FILL);
  Quadric:=glunewQuadric;
  gluSphere(Quadric,1,10,5);
  gluDeleteQuadric(Quadric);
но чтоб заработало никак не выходит- вылетает бесчисленное множество ошибок либо просто черный экран. Перерыла в сети кучу исходников и туторов, но там пока слишком сложно для моих мозгов - добавлено множество разных эффектов - вращений, подпрыгиваний и не разобраться что из этого нужно, а что нет.

Вообще, задание изобразить сферу и подобрать для нее освещение и фактуру а ля "каучуковый мяч",

если у кого есть что то похожее - киньте пожалуйста, очень хочется разобраться. )

*у меня подключены UnSetting,UnNormal,UnBuildTexture и UnBuildOpenGL

Заранее благодарна за помощь
kady вне форума Ответить с цитированием
Старый 08.11.2009, 16:01   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
но чтоб заработало никак не выходит- вылетает бесчисленное множество ошибок либо просто черный экран.
покажите свою инициализацию и получения контекста рисования
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.11.2009, 16:02   #3
Alex2009
Proger Man
Форумчанин
 
Аватар для Alex2009
 
Регистрация: 07.03.2009
Сообщений: 584
По умолчанию

http://vintprog.3dn.ru/load/1-1-0-42 в этой книге есть то что тебе нужно!
ShowMessage('Добро пожаловать!');
Alex2009 вне форума Ответить с цитированием
Старый 09.11.2009, 22:24   #4
kady
 
Регистрация: 08.11.2009
Сообщений: 7
По умолчанию

Спасибо,
села разбираться, кое-что уже разобрала из учебника Краснова, сейчас еще этот проштудирую.
kady вне форума Ответить с цитированием
Старый 09.11.2009, 22:50   #5
kady
 
Регистрация: 08.11.2009
Сообщений: 7
По умолчанию

уже все переписала - все равно ошибка(((

UnDraw.pas :

Код:
unit UnDraw;

interface
uses OpenGL,UnNormal,UnBuildTexture;
procedure DrawScene;
var
 UgolX,UgolY:real;
 temp:real;
 vector:Tvector;
 quadObj : GLUquadricObj;






const
 LIGHT_DIFF:array[0..3] of glFloat =(1,1,1,1);
 LIGHT_SPEC:array[0..3] of glFloat =(1,1,1,1);
 LIGHT_AMBI:array[0..3] of glFloat =(1,1,1,1);
 DATA:array[0..3] of glFloat = (1,1,1,0.5);
 mode : (POINT, LINE, FILL, SILHOUETTE) = FILL;

implementation
procedure DrawScene;

//var
//cisloto4ek,cislolinii: integer;

begin

   glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);      
 glPushMatrix;

 glTranslatef(0,0,-5);

 glRotatef(UgolX,1,0,0);
 glRotatef(UgolY,0,1,0);

 glColor3f (0.0, 0.0, 0.0);     




 glRotatef (90.0, 1.0, 0.0, 0.0);

 case mode of
   POINT : gluQuadricDrawStyle (quadObj, GLU_POINT);
   LINE  : gluQuadricDrawStyle (quadObj, GLU_LINE);
   FILL  : gluQuadricDrawStyle (quadObj, GLU_FILL);
   SILHOUETTE : gluQuadricDrawStyle (quadObj, GLU_SILHOUETTE);
 end;

 gluSphere (quadObj, 1.0, 10, 10);

 glPopMatrix;


end;


end.
Main:

Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls,UnSetting, StdCtrls;


type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Panel1: TPanel;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  DC: HDC;      
  hrc: HGLRC;   

implementation

uses UnBuildOpenGL,UnDraw,OpenGL,UnBuildTexture;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
CreatOpenGL;
Set_OpenGL;
Randomize;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ResetOpenGL;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
DrawScene;
swapBuffers(DC);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
DrawScene;
swapBuffers(DC);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
 glViewPort(0,0,width,height) ;
 glMatrixMode(GL_PROJECTION) ;
 glLoadIdentity;
 gluPerspective(20,1.66,1/2,50);
 glMatrixMode(GL_MODELVIEW) ;
 glLoadIdentity;
 
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case key of
  37: UgolY:=UgolY-5;
  38: UgolX:=UgolX-5;
  39: UgolY:=UgolY+5;
  40: UgolX:=UgolX+5;
  107: temp:=temp-1;
  109: temp:=temp+1;
 end;
 label1.Caption:=FloatToStr(temp);
end;

end.
UnBuildOpenGL:
Код:
unit UnBuildOpenGL;

interface

uses
  Windows, OpenGL, Main;

  procedure CreatOpenGL;
  procedure ResetOpenGL;
  procedure SetDCPixelFormat;

implementation

var
  startOpenGL: boolean; 
 Creat_OpenGL;


procedure CreatOpenGL;
begin
  DC :=GetDC(Form1.Handle);   
  SetDCPixelFormat;            
  hrc:=wglCreateContext(DC);   
  wglMakeCurrent(DC, hrc);     
  startOpenGL:=true;
end;


procedure SetDCPixelFormat;
var
  nPixelFormat: Integer;
  pfd: TPixelFormatDescriptor;
begin
  FillChar(pfd, SizeOf(pfd), 0);
 
  pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  nPixelFormat := ChoosePixelFormat(DC, @pfd);
  SetPixelFormat(DC, nPixelFormat, @pfd);
end;


procedure ResetOpenGL;
begin
  if startOpenGL then begin
    wglMakeCurrent(0, 0);
    wglDeleteContext(hrc);
    ReleaseDC(Form1.Handle, DC);
    DeleteDC (DC);
  end;
end;

end.


  DC: HDC;      
  hrc: HGLRC;
kady вне форума Ответить с цитированием
Старый 09.11.2009, 22:50   #6
kady
 
Регистрация: 08.11.2009
Сообщений: 7
По умолчанию

UnSetting:
Код:
unit UnSetting;
interface
uses OpenGL;

var
  Quadric : GLUquadricObj;

const
  LightColA : Array [0..3] of GLFloat = (1, 1, 1, 1.0); //Ðàññåÿí
  LightColD : Array [0..3] of GLFloat = (1, 1, 1, 1.0); //Äèôô
  LightColS : Array [0..3] of GLFloat = (1, 1, 1, 1.0); //Çåðêàë

  LightPos : Array [0..3] of GLFloat = (0, 1, 0, 1); //Ïîëîæåíèå îñâåòèòåëÿ
  LightNapr : Array [0..2] of GLFloat = (0, -1, -2); //Íàïðàâë
procedure Set_OpenGL;


implementation

procedure Set_OpenGL;
const
  LightFara : Array [0..3] of GLFloat = (0.2, 0.4, 0.2, 1); //Öâåò ôàðû
begin
  Quadric := gluNewQuadric;
  gluQuadricTexture (Quadric, TRUE);

  glEnable(GL_LIGHTING); // Âêëþ÷åíèå îñâåùåíèÿ
  glEnable(GL_LIGHT0); // Âêëþ÷åíèå îñâåùåíèÿ
  glLightfv(GL_LIGHT0, GL_AMBIENT, @LightColA);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, @LightColD);
  glLightfv(GL_LIGHT0, GL_SPECULAR, @LightColS);
  glLightfv(GL_LIGHT0, GL_POSITION, @LightPos);
//  glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,1.9);// Øèðèíà ëó÷à
//  glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,@LightNapr);
//  glLightf(GL_LIGHT0,GL_SPOT_EXPONENT, 127);//
//  glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION, 0.1);////Çàòóõàíèå
  // Îñâåùåíèå îáåèõ ñòîðîí ïîâåðõíîñòåé
  glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1);

  //Âêëþ÷åíèå òåñòà ãëóáèíû ñöåíû
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_ALPHA_TEST);

  // Ðàçðåøèòü ñìåøèâàíèå öâåòîâ
  glEnable (GL_BLEND);
  // Âûáîð ñïîñîáà ñìåøèâàíèÿ
  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  //Êîýôôèöèåíò ïðîçðà÷íîñòè àëüôà òåñòà
  glAlphaFunc(GL_GEQUAL,0.8);
  
  // Ðàçðåøèòü íàëîæåíèå òåêñòóð
  glEnable(GL_TEXTURE_2D);
  // Ïàðàìåòðû íàëîæåíèÿ òåêñòóðû
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
end;

end.
kady вне форума Ответить с цитированием
Старый 09.11.2009, 22:54   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

эм... тут внизу есть кнопочка - "расширенный режим", там будет скрепка (вложения), приложите туда лучше ваш проект
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 09.11.2009, 23:40   #8
kady
 
Регистрация: 08.11.2009
Сообщений: 7
По умолчанию

Туплю.. однозначно) Кинула.
Я сейчас подумала - может это из-за glu? - что то подключить надо было, а у меня нет..
Вложения
Тип файла: rar щар черный.rar (141.0 Кб, 24 просмотров)
kady вне форума Ответить с цитированием
Старый 10.11.2009, 00:33   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

подрихтовал ваш проект, держите...

зы: разбитие на модули конечно это дело хорошее, но когда проект небольшой это создает только путаницу
зы: работа с glut
Изображения
Тип файла: jpg скрин.jpg (13.9 Кб, 147 просмотров)
Вложения
Тип файла: zip sph.zip (10.5 Кб, 66 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 10.11.2009 в 00:35.
raxp вне форума Ответить с цитированием
Старый 10.11.2009, 19:48   #10
kady
 
Регистрация: 08.11.2009
Сообщений: 7
По умолчанию

Спасибо огромное за помощь!
Сейчас буду источник ставить)
Насчет модулей- нас так учат - что ж тут поделаешь))
Еще раз -большое спасибо!
kady вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение сферы в Visual Basic. Sergantes Помощь студентам 3 06.10.2009 21:20
Непонятки с рисованием на форме ROD Общие вопросы C/C++ 2 03.02.2009 18:14
Проблема с рисованием прямоугольника Юра. Общие вопросы Delphi 13 04.08.2007 06:08
Help!!!Движение точки по поверхности сферы alex23xandr Помощь студентам 4 20.05.2007 14:45
Помогите с рисованием на Delphi, компонент paintbox Jose Общие вопросы Delphi 10 01.02.2007 14:18