Теория и код трехмерной графики без OpenGL, DirectX, XNA и др. [Закрыто]

Мне было интересно, были ли какие-то учебник, который знакомит с теорией трехмерной графики и показывает соответствующий код, без с использованием OpenGL или DirectX или чего-то еще. Мне очень нравится инженерная математика (я студент A / V DSP, поэтому я много работаю с математики все время).

В большинстве учебных пособий, которые я вижу, либо показаны одни и те же примеры сдвига / поворота старых матриц, наряду с обсуждением проекций, и показано, как работают проекции с использованием аналогичных треугольников, либо предполагается, что вы знаете все о 3D или просто используйте кучу примитивов OpenGL. Я заказал книгу (Интерактивная компьютерная графика: подход сверху вниз) по этой теме, но хочу получить звезду тед прямо сейчас.

Мне бы очень хотелось что-то, что просто работало бы с поверхностью SDL или объектом Java Graphics2D и просто использовало матричную математику для визуализации всего. Я надеялся, что смогу делать некоторые простые вещи, например, отрисовывать простые формы до того, как появится книга. В идеале что-то, что вводит темы и дает закодированные примеры того, как они работают.

РЕДАКТИРОВАТЬ: Все ответы были отличными, но мне просто понравился код. Именно то, что я искал, даже если он был на Паскале;)

7
задан GrayGnome 11 August 2010 в 06:29
поделиться

4 ответа

Захоронил какой-то старый паскальский источник: D Около 14 лет назад я использовал его для отображения очень простых трехмерных объектов. xrot, yrot, zrot - вращать точки ([x, y, z] умноженные на матрицу вращения). И я использовал очень простое преобразование из 3D в 2, основанное на проекции точки схода с точкой схода в центре экрана. В качестве примера определен массив вершин. Вам также необходимо добавить массив тригонов.

const depth = 1500;
      deg = pi / 180;

      { some vertices for a dice :) }
      vertices:array[0..23] of real= (50, 50, 50,       { 0}
                                 -50, 50, 50,       { 1}
                                  50,-50, 50,       { 2}
                                 -50,-50, 50,       { 3}
                                  50, 50,-50,       { 4}
                                 -50, 50,-50,       { 5}
                                  50,-50,-50,       { 6}
                                 -50,-50,-50,       { 7}
                                  );

{ transform 3d coordinates to pixel coordinates }
procedure 3d_to_2d(x, y, z : real; var px, py : longint);
 var k:real;
begin
 k:=((depth shr 1)+z)/depth;
 px:=(getmaxx shr 1)+trunc(x*k);      { getmaxx is the width of the screen }
 py:=(getmaxy shr 1)+trunc(y*k);      { getmaxy is the height of the screen }
end;

{ rotate around the x axis by rx degrees }
procedure xrot(var x,y,z:real;rx:integer);
 var x1,y1,z1:real;
begin
 y1:=(y * cos(rx * deg))+(z* (sin(rx * deg)));
 z1:=(-y* sin(rx * deg))+(z* (cos(rx * deg)));
 y:=y1; z:=z1;
end;

{ rotate around the y axis by ry degrees }
procedure yrot(var x,y,z:real;ry:integer);
 var x1,y1,z1:real;
begin
 x1:=(x * cos(ry * deg))+(z*(sin(ry * deg)));
 z1:=(-x * sin(ry * deg))+(z*(cos(ry * deg)));
 x:=x1; z:=z1;
end;

{ rotate around the z axis by rz degrees }
procedure zrot(var x,y,z:real; rz:integer);
 var x1,y1,z1:real;
begin
 x1:=(x* cos(rz * deg))+(y*(sin(rz * deg)));
 y1:=(-x* sin(rz * deg))+(y*(cos(rz * deg)));
 x:=x1; y:=y1;
end;

Для тригонов с заливкой я использовал функцию друга, которая рисует фигуру с помощью горизонтальных линий (Hline (x, y, ширина, цвет)):

    TYPE pt=RECORD x,y:LongInt;END;  

PROCEDURE Tri(P:ARRAY OF pt;co:BYTE);
VAR q,w:INTEGER;
    S:pt;
    f12,f13,f23:LongInt;
    s1,s2:LongInt;


BEGIN

  IF p[0].y>p[2].y THEN BEGIN s:=p[0];p[0]:=p[2];p[2]:=s;END; { sort the points }
  IF p[0].y>p[1].y THEN BEGIN s:=p[0];p[0]:=p[1];p[1]:=s;END;
  IF p[1].y>p[2].y THEN BEGIN s:=p[1];p[1]:=p[2];p[2]:=s;END;

  q:=(p[0].y-p[1].y); { y distance between point 0 and 1 }
  IF q<>0 THEN f12:=LongInt((p[0].x-p[1].x) shl 6) DIV q ELSE f12:=0;

  q:=(p[0].y-p[2].y);
  IF q<>0 THEN f13:=LongInt((p[0].x-p[2].x) shl 6) DIV q ELSE f13:=0;

  q:=(p[1].y-p[2].y);
  IF q<>0 THEN f23:=LongInt((p[1].x-p[2].x) shl 6) DIV q ELSE f23:=0;

  s1:=p[0].x shl 6;s2:=s1;
  FOR q:=p[0].y TO p[1].y DO
  BEGIN
    Hline(s1 shr 6,s2 shr 6,q,co);
    s1:=s1+f12;
    s2:=s2+f13;
  END;
  s1:=p[2].x shl 6;s2:=s1;
  FOR q:=p[2].y DOWNTO p[1].y DO
  BEGIN
    Hline(s1 shr 6,s2 shr 6,q,co);
    s1:=s1-f23;
    s2:=s2-f13;
  END;
END;
7
ответ дан 6 December 2019 в 14:00
поделиться

Получите эту книгу

или хотя бы возьмите ее в ближайшей университетской библиотеке.

Computer graphics, principles and practice


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

4
ответ дан 6 December 2019 в 14:00
поделиться

Один из способов избежать решений OpenGL и DirectX - это поискать старые книги по графике, предшествующие OpenGL и DirectX - например, что-то из середины 80-х (OpenGL, возможно, существовал, но не получил широкого распространения на ПК). Будьте готовы перевести с GWBasic или подобного. ;>

Или просто возьмите учебник по тригонометрии. Преобразование трехмерных координат в двухмерные - это не что иное, как тригонометрия и иногда рассматривается как расширенная тема в книгах по триггерам.

2
ответ дан 6 December 2019 в 14:00
поделиться

Эта серия статей помогла мне понять основы 3D-графики: Изучение 3D во Flash . Статьи находятся в ActionScript / ECMAScript в среде Flash DOM, но их можно легко перевести в другие среды.

Я лично следил за статьями, переводя примеры в Tcl / Tk, рисование на холсте Tk. Вместо этого вы можете попробовать Perl / Tk или TkInter, или более близкий перевод - это javascript с использованием холста HTML5 или чего-то вроде Raphael для рисования. К концу статьи у вас будет простой, но удобный 3D API.

2
ответ дан 6 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: