Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите новичкам, 3D графика 
:(
    Опции темы
Gigabyte
Дата 11.11.2004, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



Как мне можно вывести 3D графику с помощью Дельфи smile
и если можно учебник по opelGL smile


--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
Zero
Дата 11.11.2004, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата
Как мне можно вывести 3D графику с помощью Дельфи

Я недвно делал Lab'у по OpenGL, вот тебе пример, ручки пишущей по Nurbs-поверхности.
При этом на форме ничего нету.
Код

unit Unit1;

interface

uses
 Windows, Messages, Forms, Classes, Controls, ExtCtrls, ComCtrls,
 StdCtrls, Dialogs, SysUtils, OpenGL, Menus;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);


 private
   hrc: HGLRC;
   Position: Array [0..3] of GLFloat;

 end;
 TBitmapHeader= array[0..53] of byte;
 TRGB=record
     b,g,r:byte;
     end;
 TRGBA=record
     b,g,r,a:byte;
     end;
 TRGBArray=array[0..4096] of TRGB;
 TRGBAArray=array[0..4096] of TRGBA;
 PRGBAArray=^TRGBAArray;
 GLArr=array[0..3]of GLFloat;

var
 Form1: TForm1;
  uknot:array[0..7] of GLFloat = (0, 0, 0, 0, 1, 1, 1, 1);
 vknot:array[0..7] of GLFloat = (0, 0, 0, 0, 1, 1, 1, 1);
 ctlarray:array[0..3,0..3,0..2] of GLFloat =
 (
 (//U[1]
   (-0.8,0.8,0.5), //V[1]
   (-0.5,1,0.2),   //V[2]
   (0.5,1,0.2),    //V[3]
   (0.8,0.8,0.5)), //V[4]
 (//U[2]
   (-1, 0.5, 0.5), //V[1]
   (-0.5, 0.5, -0.2),//V[2]
   (0.5, 0.5, -0.2), //V[3]
   (1, 0.5, 0.5)),   //V[4]
 (//U[3]
   (-1, -0.5, 0.4),  //V[1]
   (-0.5,-0.5,-0.2), //V[2]
   (0.5, -0.5, -0.2), //V[3]
   (1, -0.5, 0.4)),   //V[4]
 (//U[4]
   (-0.8, -0.8, 0.5),//V[1]
   (-0.5, -1, 0.2),  //V[2]
   (0.5, -1, 0.2),   //V[3]
   (0.8, -0.8, 0.5)) //V[4]
 );

 wX, wY: single;
 rX, rY: single;
 rotate: Boolean;
 dc:hdc;
 QuadObj: GLUquadricObj;
 Nurbs:GluNurbsObj;

implementation

{$R *.DFM}

procedure TForm1.FormPaint(Sender: TObject);
begin
 glClearColor (0, 0.5, 1, 1.0);
 glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glEnable(GL_COLOR_MATERIAL);

 glEnable (GL_DEPTH_TEST);
 glEnable (GL_AUTO_NORMAL);
 glEnable (GL_NORMALIZE);

 //Установка источника света
 glEnable (GL_LIGHTING);
 glEnable (GL_LIGHT0);

 Position [0] := 100;
 Position [1] := 5;
 Position [2] := -5;
 Position [3] := 0;
 glLightfv (GL_LIGHT0, GL_POSITION, @position);

 glPushMatrix();
 glRotatef (rx, 0, 1, 0);
 glRotatef (rY, 1, 0, 1);

 (******************** Бумага **************************************************)

 Nurbs:=gluNewNurbsRenderer;

 glMatrixMode(GL_MODELVIEW);
 glPushMatrix;
 glLoadIdentity;
 glRotatef(rX+15,0,1,0);
 glRotatef(ry+65,1,0,0);
 gluNurbsProperty(Nurbs,Glu_DISPLAY_MODE, GLU_OUTLINE_POLYGON);

 gluBeginSurface(Nurbs);
 gluNurbsSurface(Nurbs,4*2,@uknot,4*2,@vknot,4*3,3,@ctlarray,4,4,GL_MAP2_VERTEX_3);
 gluEndSurface(Nurbs);

 QuadObj:=gluNewQuadric;
 gluQuadricDrawStyle(QuadObj, GLU_FILL);


 gluQuadricTexture (QuadObj,true);

 glRotatef(rX+45,0,1,0);
 glRotatef(ry+300,1,0,0);


(******************** Стержень ************************************************)
         //Стержень (наконечник)
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, -0.32);
  glColor3f(4, 1, 0);
  gluCylinder(QuadObj, 0, 0.008, 0.03, 10, 10);
  glPopMatrix();

         //Стержень (продолжение наконечника)
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, -0.29);
  glColor3f(4, 1, 0);
  gluCylinder(QuadObj, 0.008, 0.008, 0.04, 10, 10);
  glPopMatrix();

         //Стержень (место с чернилами)
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, -0.25);
  glColor3f(0, 0, 0);
  gluCylinder(QuadObj, 0.01, 0.01, 0.45, 10, 10);
  glPopMatrix();

         //Стержень (место с чернилами(где они закончились))
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, 0.2);
  glColor3f(1, 1, 1);
  gluCylinder(QuadObj, 0.01, 0.01, 0.5, 10, 10);
  glPopMatrix();

(******************** Поверхность ручки ***************************************)

     //Конец ручки
 glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, -0.28);
  glColor3f(8, 8, 1);
  gluCylinder(QuadObj, 0.012, 0.03, 0.1, 10, 10);
  glPopMatrix();

        //Место между которым держут ручку и наконечником
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, -0.18);
  glColor3f(1,1, 1);
  gluCylinder(QuadObj, 0.033, 0.035, 0.05, 10, 10);
  glPopMatrix();

         //Место за которое держут ручку
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, -0.13);
  glColor3f(0,0.6, 0.8);
  gluCylinder(QuadObj, 0.033, 0.035, 0.2, 10, 10);
  glPopMatrix();

         //Прозрачное место ручки
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, 0.07);
  glColor3f(1,1, 1);
  gluCylinder(QuadObj, 0.033, 0.035, 0.5, 10, 10);
  glPopMatrix();

          //То, чем закручивают стержень (без наконечника)
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, 0.57);
  glColor3f(0,0, 1);
  gluCylinder(QuadObj, 0.033, 0.033, 0.14, 10, 10);
  glPopMatrix();

         //Наконечник
  glPushMatrix();
  glRotatef(-90, 90, -90, -90);
  glTransLatef(0.3, 0.04, 0.71);
  glColor3f(0,0,1);
  gluCylinder(QuadObj, 0.033, 0, 0.005, 10, 10);
  glPopMatrix();

 glPopMatrix();
 SwapBuffers(dc);

 glPopMatrix;
 glFlush;
 gluDeleteNurbsRenderer(Nurbs);
end;

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


procedure TForm1.FormCreate(Sender: TObject);
begin
dc:=getdc(Handle);
SetDCPixelFormat(dc);
hrc := wglCreateContext(dc);
wglMakeCurrent(dc, hrc);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  gluDeleteQuadric (QuadObj);
  wglMakeCurrent (0, 0);
  wglDeleteContext (hrc);
  ReleaseDC (Handle, DC);
  DeleteDC(DC);
end;

(******************** Перемещение с помощью мыши*******************************)
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 wX:=X;
 wY:=Y;
 rotate:=true;
 InvalidateRect(handle, nil, false);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 rotate:=false;
 InvalidateRect(handle, nil, false);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
if rotate then
 begin
   rX := rX+(X-wX)/2;
   rY := rY+(Y-wY)/2;
   wX := X;
   wY := Y;
   InvalidateRect(handle, nil, false);
 end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 If Key = vk_escape then Close;
end;

end.

Цитата
и если можно учебник по opelGL

Зайди в любой поисковик, и напиши "Учебни по OpenGl", там тебе выдадут кучу учебников, для примера вот один из них Учебник
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1019 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.