Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 25.09.2009
Сообщений: 15
1

: Элементы интерактивной компьютерной 3D-графики

11.10.2009, 17:12. Показов 3425. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
30. Прочитать из файла заданного формата и построить на экране каркас многогранника. Организовать вращение вокруг координатных осей с помощью мыши.
31. Прочитать из файла заданного формата и построить на экране изображение многогранника с удалением невидимых линий. Организовать вращение вокруг координатных осей с помощью мыши.
32. Прочитать из файла заданного формата и построить на экране реалистическое изображение многогранника «в тенях». Организовать вращение вокруг координатных осей с помощью мыши

Решить нужно в делфи.
Помогите пожалуйста решить задачку. Признаюсь, ничего не понимаю в делфи, но эта задачка нужна позарез.

Пожалуйста((((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2009, 17:12
Ответы с готовыми решениями:

Элементы компьютерной графики
Даны восемь действительных положительных чисел, задающие число дней в году, в которых преобладало...

Где обучают компьютерной графики в Новосибирске?
Хочу пойти на курсы компьютерной графики, но не знаю куда.. Может кто знает, где есть курсы...

DirectX, openGl или создание компьютерной графики
Добрый вечер уважаемые читатели форума. Как я уже говорил ранее я закончил с теорией языка C#...

Выбор видеокарты для видеомонтажа и компьютерной графики
Мне нужна карта в пределах 4.000р для видеомонтажа и работы со спецэффектами. Подскажите какую...

10
3424 / 1611 / 236
Регистрация: 26.02.2009
Сообщений: 7,875
Записей в блоге: 5
14.10.2009, 14:41 2
Какой API? DirectX или OpenGL? А может что то др.
Какой формат моделей? ( 3ds, dxf и тп )

Цитата Сообщение от norka746 Посмотреть сообщение
многогранника «в тенях»
Это с применением простого освещения? или исчо чтоб реальная тень была?

Добавлено через 2 минуты
Цитата Сообщение от norka746 Посмотреть сообщение
Организовать вращение вокруг координатных осей с помощью мыши
Вокруг 3х осей или 2х достаточно?
0
1 / 1 / 0
Регистрация: 25.09.2009
Сообщений: 15
14.10.2009, 17:14  [ТС] 3
Сейчас кину что должно быть:
Вложения
Тип файла: 7z ПРЗ ЭВМ.7z (160.5 Кб, 87 просмотров)
0
1 / 1 / 0
Регистрация: 25.09.2009
Сообщений: 15
14.10.2009, 17:15  [ТС] 4
Так наверное будет более нагляднее
0
1 / 1 / 0
Регистрация: 25.09.2009
Сообщений: 15
15.10.2009, 00:46  [ТС] 5
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
        ghRC:HGLRC;
        ghDC:HDC;
        procedure Draw;
 
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 
function bSetupPixelFormat(DC:HDC):boolean;
var
    pfd:PIXELFORMATDESCRIPTOR;
    ppfd:PPIXELFORMATDESCRIPTOR;
    pixelformat:integer;
begin
    ppfd := @pfd;
 
    ppfd.nSize := sizeof(PIXELFORMATDESCRIPTOR);
    ppfd.nVersion := 1;
    ppfd.dwFlags :=  PFD_DRAW_TO_WINDOW xor
                     PFD_SUPPORT_OPENGL xor
                     PFD_DOUBLEBUFFER;
    ppfd.dwLayerMask := PFD_MAIN_PLANE;
    ppfd.iPixelType := PFD_TYPE_RGBA;
    ppfd.cColorBits := 16;  
    ppfd.cDepthBits := 16;
 
    ppfd.cAccumBits := 0;
    ppfd.cStencilBits := 0;
 
    pixelformat := ChoosePixelFormat(dc, ppfd);
    if pixelformat=0 then
    begin
        MessageBox(0, 'ChoosePixelFormat failed', 'Error', MB_OK);
        bSetupPixelFormat:=FALSE;
        exit;
    end;
 
    if SetPixelFormat(dc, pixelformat, ppfd)=false then
    begin
        MessageBox(0, 'SetPixelFormat failed', 'Error', MB_OK);
        bSetupPixelFormat:=FALSE;
        exit;
    end;
 
    bSetupPixelFormat:=TRUE;
end;
 
procedure piped(a,b,c:GLfloat);
begin
  glShadeModel(GL_FLAT);
  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  glBegin(GL_QUAD_STRIP);
    glVertex3f(-a/2,-b/2,-c/2);
    glVertex3f(-a/2,-b/2, c/2);
    glVertex3f(-a/2, b/2,-c/2);
    glVertex3f(-a/2, b/2, c/2);
 
    glVertex3f( a/2, b/2,-c/2);
    glVertex3f( a/2, b/2, c/2);
 
    glVertex3f( a/2,-b/2,-c/2);
    glVertex3f( a/2,-b/2, c/2);
 
    glVertex3f(-a/2,-b/2,-c/2);
    glVertex3f(-a/2,-b/2, c/2);
  glEnd;
  glBegin(GL_QUADS);
    glVertex3f(-a/2,-b/2, c/2);
    glVertex3f(-a/2, b/2, c/2);
    glVertex3f( a/2, b/2, c/2);
    glVertex3f( a/2,-b/2, c/2);
 
    glVertex3f(-a/2,-b/2,-c/2);
    glVertex3f(-a/2, b/2,-c/2);
    glVertex3f( a/2, b/2,-c/2);
    glVertex3f( a/2,-b/2,-c/2);
  glEnd;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
   p: TGLArrayf4;
   d: TGLArrayf3;
begin
   ghDC := GetDC(Handle);
   if bSetupPixelFormat(ghDC)=false then
     Close();
   ghRC := wglCreateContext(ghDC);
   wglMakeCurrent(ghDC, ghRC);
 
   glClearColor(0.0, 0.0, 0.0, 0.0);
 
   FormResize(Sender);
 
   glEnable(GL_COLOR_MATERIAL);
   glEnable(GL_DEPTH_TEST);
 
   //glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
     p[0]:=3;
     p[1]:=3;
     p[2]:=3;
     p[3]:=1;
     d[0]:=-1;
     d[1]:=-1;
     d[2]:=-3;
   glLightfv(GL_LIGHT0,GL_POSITION,@p);
   glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,@d);
end;
 
procedure TForm1.FormResize(Sender: TObject);
begin
glViewport( 0, 0, Width, Height );
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-5,5, -5,5, 2,12);
   gluLookAt(0,0,5, 0,0,0, 0,1,0);
   glMatrixMode( GL_MODELVIEW );
end;
 
 
procedure TForm1.Draw;
var
  quadObj :GLUquadricObj;
begin
  glClear(GL_DEPTH_BUFFER_BIT xor GL_COLOR_BUFFER_BIT);
 
  glRotatef(3, 0,1,0);
  glColor3f(0.6,0.7,0.9);
  glPushMatrix;
    glRotatef(10, 0,0,1);
    glRotatef(25, 0,1,0);
    glRotatef(20, 1,0,0);
    piped(5,5,5);
  glPopMatrix;
  SwapBuffers(ghDC);
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ghRC<>0 then
  begin
    wglMakeCurrent(ghDC,0);
    wglDeleteContext(ghRC);
  end;
  if ghDC<>0 then
    ReleaseDC(Handle, ghDC);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Draw;
end;
 
end.
Добавлено через 25 секунд
как наложить текстуру?
0
3424 / 1611 / 236
Регистрация: 26.02.2009
Сообщений: 7,875
Записей в блоге: 5
15.10.2009, 15:40 6
Цитата Сообщение от norka746 Посмотреть сообщение
как наложить текстуру?
Вначале нужно загрузить в массив картику из файла или программно заполнить его.
С помощью glTexImage2D определить текстурное изображение используя сформированный ранее массив. После этого массив уже не нужен можно его удалить.
Определть параметры текстурирования( фильтрация, среда, намотка )
Собственно включить текстуру glEnable( GL_TEXTURE_2D );
При воспроизведении указать текстурные координаты для каждой вершины(glTexCoord2f) или включить автоматическую генерацию их, но там ещё надо задать ф-ию генерации.

Добавлено через 5 минут
В Вашем посте #5 я не увидел нормалей. Их нужно обязательно задавать перед вершинами иначе включение освещения ничего не изменит, тк рассчёт освещения опирается на нормали.
0
3424 / 1611 / 236
Регистрация: 26.02.2009
Сообщений: 7,875
Записей в блоге: 5
15.10.2009, 18:56 7
Цитата Сообщение от norka746 Посмотреть сообщение
PFD_DRAW_TO_WINDOW xor
PFD_SUPPORT_OPENGL xor
PFD_DOUBLEBUFFER;
почему xor, а не or?

Добавлено через 40 минут
для расчёта нормалей можете глянуть
gltGetNormalVector в Delphi !
0
1 / 1 / 0
Регистрация: 25.09.2009
Сообщений: 15
16.10.2009, 14:15  [ТС] 8
Мне преподаватель вообще сказал, что это не правильная программа, что я вас так не учил, и пришлось переделывать, вот что вышло( только каркас):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Math;
 
type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  private
    { Private declarations }
    procedure DrawGrane(i:integer);
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
  type Point=record x,y,z:real end;
  var V:array[1..100] of Point;
      E:array[1..100,0..100] of byte;
      Cx,Cy:integer;
      Scale:real;
      N,M:integer;
      x0,y0:integer;
 
{$R *.DFM}
 
procedure TForm1.FormCreate(Sender: TObject);
  var f:textfile;
      i,j:integer;
begin
  Cx:=ClientWidth div 2;
  Cy:=ClientHeight div 2;
  Scale:=100;
  // Чтение из файла
  assignfile(f,ExtractFilePath(Application.ExeName)+'cube.txt'); reset(f);
  readln(f,N);
  for i:=1 to N do
    readln(f,V[i].X,V[i].Y,V[i].Z);
  readln(f,M);
  for i:=1 to M do begin
    j:=0;
    while not eoln(f) do begin
      inc(j);read(f,E[i,j])
    end;
    readln(f);
    E[i,0]:=j;
  end;
  closefile(f);
  Repaint;
end;
 
// Преобразование координат
function XScr(x:real):integer;
begin Xscr:=Cx+round(x*Scale); end;
function YScr(y:real):integer;
begin Yscr:=Cy-round(y*Scale); end;
 
// Повороты точки
procedure RX(a:real;var P:Point);
  var Q:Point;
begin
  Q.x:=P.x;
  Q.y:=cos(a)*P.y-sin(a)*P.z;
  Q.z:=sin(a)*P.y+cos(a)*P.z;
  P:=Q;
end;
procedure RY(a:real;var P:Point);
  var Q:Point;
begin
  Q.x:=cos(a)*P.x+sin(a)*P.z;
  Q.y:=P.y;
  Q.z:=-sin(a)*P.x+cos(a)*P.z;
  P:=Q;
end;
procedure RZ(a:real;var P:Point);
  var Q:Point;
begin
  Q.x:=cos(a)*P.x-sin(a)*P.y;
  Q.y:=sin(a)*P.x+cos(a)*P.y;
  Q.z:=P.z;
  P:=Q;
end;
 
// Повороты граней
procedure RotateX(a:real);
  var i:integer;
begin
  for i:=1 to N do RX(a,V[i]);
end;
procedure RotateY(a:real);
  var i:integer;
begin
  for i:=1 to N do RY(a,V[i]);
end;
procedure RotateZ(a:real);
  var i:integer;
begin
  for i:=1 to N do RZ(a,V[i]);
end;
 
// Рисование грани
procedure TForm1.DrawGrane(i:integer);
  var j,k:integer;
begin
  k:=E[i,0];
  Canvas.MoveTo(Xscr(V[E[i,k]].X),Yscr(V[E[i,k]].Y));
  for j:=1 to k do Canvas.LineTo(Xscr(V[E[i,j]].X),Yscr(V[E[i,j]].Y));
end;
 
// Перерисовка формы
procedure TForm1.FormPaint(Sender: TObject);
    var i:integer;
begin
  for i:=1 to M do DrawGrane(i);
end;
 
// Управление мышью
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  x0:=x; y0:=y;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  var a,b,c,Cf,Ca:real;
begin
  if ssLeft in Shift then begin
   // RotateY((x-x0)*pi/180);
    //RotateX((y-y0)*pi/180);
   a:=sqrt(sqr(x0-Cx)+sqr(y0-Cy));
      b:=sqrt(sqr(x-Cx)+sqr(y-Cy));
        c:=sqrt(sqr(x-x0)+sqr(y-y0));
        Cf:=(sqr(a)+sqr(b))-2*(a*b/c);
        [B]Ca:=arccos(Cf);[/B] 
    RotateZ((x-x0)*pi/180);
    x0:=x; y0:=y;
    Repaint;
  end;
end;
 
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  Scale:=Scale+WheelDelta/5;
  if Scale<50 then Scale:=50;
  Repaint;
end;
 
 
end.
А вот еще дополнительные задания к тем задачкам:
33. Разработать приложение «Визуализатор многогранников» со следующим набором функций:
• считывание из файла
• сохранение в файле
• переключение режимов отображения (три режима – см. [30] - [32])
• вращение вокруг любой из трех координатных осей
• увеличение/уменьшение масштаба
• сдвиг начала координат
• выбор цветовой гаммы для источника освещения
34. Создать для приложения из задачи [33] набор входных файлов с описанием следующих тел, приближая их, если надо, многогранниками:
• куб;
• тетраэдр;
• октаэдр;
• пирамида;
• призма;
• конус;
• цилиндр;

Добавлено через 2 минуты
Ca:=arccos(Cf);
Когда запускаю программу (все запускается), но выдает ошибку:
[Hint] Unit1.pas(148): Value assigned to 'Ca' never used
Причем, только тогда, когда я пытаюсь повернуть многогранник,
Что за хренотень?
0
3424 / 1611 / 236
Регистрация: 26.02.2009
Сообщений: 7,875
Записей в блоге: 5
17.10.2009, 02:47 9
Цитата Сообщение от norka746 Посмотреть сообщение
Ca:=arccos(Cf);
Когда запускаю программу (все запускается), но выдает ошибку:
[Hint] Unit1.pas(148): Value assigned to 'Ca' never used
Причем, только тогда, когда я пытаюсь повернуть многогранник,
Что за хренотень?
Цитата Сообщение от Delphi Help
ArcCos returns the inverse cosine of X.
X must be between -1 and 1.
The return value is in the range [0..Pi], in radians
Cf далеко выходит за рамки (-1..1). Не верный рассчёт.
А зачем вообще Cf нужно, если далее нигде не используется?
Замените событие FormMouseMove. Вот так работает:
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then begin
    RotateX((y-y0)*pi/180);
    RotateY((x-x0)*pi/180);
    x0:=x; y0:=y;
    Repaint;
  end;
end;
Какую литературу используете? Есть ссылки или название книг? Может лекции в эл.ном виде имеются?
0
1 / 1 / 0
Регистрация: 25.09.2009
Сообщений: 15
17.10.2009, 21:07  [ТС] 10
snake32, Вот именно, мне нужно придумать как сделать поворот многогранника не только вокруг осей Х и У но и вокруг Z
0
3424 / 1611 / 236
Регистрация: 26.02.2009
Сообщений: 7,875
Записей в блоге: 5
18.10.2009, 05:07 11
Цитата Сообщение от norka746 Посмотреть сообщение
поворот многогранника не только вокруг осей Х и У но и вокруг Z
norka746, вариантов масса:
1,Самый простой - это использовать клавиатуру вместо мыши, благо кнопок на ней больше чем осей мышки.
2, Задействовать колёсико (оно же средняя кнопка) как третья ось на мыши. Там где обычно зум прикручиваю.
3, Использовать кнопку Shift вместе с мышой, те без шифта оси мыши X Y соответствуют повороту X и Y, а с shift'ом поворот осей например X и Z.
4, Добавить 3 радиобаттона в тоолбар где выбирать можно комбинации соответствия осей мыши с поворотами (XY, XZ, ZY).
5, Самый замороченый что я сейчас придумал- по мимо многогранника нарисовать какие-нибудь 3 объекта. Перемещая их мышой - вращается многогранник. Один объект связан с 1 осью.

Я думаю, пока тебе хватит вариантов. Надеюсь и сама много чего придумаешь оригинального, Но главное что бы было удобно. Хотя я не препод, не знаю, чего он ждёт от тебя.
0
18.10.2009, 05:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2009, 05:07
Помогаю со студенческими работами здесь

Написать курсовую работу на тему: Основы компьютерной графики
Помогите пожалуйста написать курсовую работу по Технологии программирования на тему: Основы...

О роли компьютерной графики во всех областях, особенно в образовании
О роли компьютерной графики во всех областях, особенно в образовании. Геометрические фигуры: что...

Дипломная работа "Использование алгоритмов компьютерной графики на Web странице HTML 5" нужна программа
дипломная работа &quot;Использование алгоритмов компьютерной графики на Web странице HTML 5&quot; нужна...

Элементы компьютерной анимации
Частица (от заданной начальной точки) совершает хаотичное движение, двигаясь в случайном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru