Важная информация
Показано с 1 по 9 из 9

Тема: Есть ли какое нибудь руководство или книга по 3D графике

  1. #1 Есть ли какое нибудь руководство или книга по 3D графике 
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    783
    Сказал(а) спасибо
    326
    Поблагодарили 347 раз(а) в 274 сообщениях
    Записей в блоге
    6
    Меня интересует руководство для самых тупых от самых азов. Все что встречал, либо поверхностно и прыжками, либо настолько мудрено, что не въехать, либо столько воды, что уже на 2-3 странице желание пропадает читать. На youtube нашел лекцию, но парень сам не до конца все понимает. Отсюда что-то разжевывает , а что-то прыснет парочкой терминов и на этом все. А в итоге общая картинка не складывается.
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,927
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    А что не понятно? Может подскажу.

    Вот небольшой FAQ который я писал, он под DOS правда, и под QuickBasic но самые азы вполне охватывает.
    Впринципе суть не меняется, что под досом, что ещё где.
    Единственное отличие, что у меня ось Z направлена вверх, а не в глубь экрана, как во всех
    современных hardware интерфейсах.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  3. Пользователь сказал cпасибо:

    stabud (19.05.2013)

  4. #3  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    783
    Сказал(а) спасибо
    326
    Поблагодарили 347 раз(а) в 274 сообщениях
    Записей в блоге
    6
    Спасибо. Веришь, нет... По алгебре была твердая четверка по крайней мере до 7 класса(включительно по старой системе). По геометрии твердая двойка, но поскольку учителю топить сильно меня не хотелось, поэтому троечку за четверть имел. Но вот ведь штука! Даже те знания, которые были по алгебре, как будто кто-то стер за ненадобностью. Остались какие-то "хлебные крошки". Хоть заново бери учебники и учись.

    Не обижайся, но для меня это скудная информация. До 5 страницы все понятно. Но дальше как-то скручено, как будто кто-то торопил тебя.

    Код :
       'Для начала определяем константы и массивы:
          CONST pi = 3.141592653589793#
          CONST Gradus = pi / 180, RAD = 180 / pi
          CONST OBZORh = 40 * Gradus, OBZORv = 33 * Gradus
          CONST RezX = 639, RezY = 479
     
          DIM Ln1Ugol!, Ln2Ugol!, Ln3Ugol!, Ln4Ugol! <- что это
          DIM a1!, a2!, a3!, a4!, b1!, b2!, b3!, b4!   <- что это
          DIM CamX!, CamY!, CamZ!, CamHcrn!, CamVcrn!  <- это тоже 
       ' Предрасчёт в самом начале программы
          Ln1Ugol! = OBZORh: Ln2Ugol! = -OBZORh
          Ln3Ugol! = OBZORv: Ln4Ugol! = -OBZORv
       a1! = SIN(Ln1Ugol!): b1! = -COS(Ln1Ugol!)
       a2! = SIN(Ln2Ugol!): b2! = -COS(Ln2Ugol!)
       a3! = SIN(Ln3Ugol!): b3! = -COS(Ln3Ugol!)
       a4! = SIN(Ln4Ugol!): b4! = -COS(Ln4Ugol!)

    Не мог бы ты прокомментировать этот участок кода. Я пометил непонятный участок. Если нет времени, я не тороплюсь, подожду. А там буду по коду смотреть дальше, хоть и непривычный синтаксис QB, но что уж есть.

    P.S. Кстати мне нравятся статьи написанные вперемешку с юмором. Тогда и обучение лучше укладывается и настроение на высоте. Вот например [Ссылки могут видеть только зарегистрированные пользователи. ]
    Последний раз редактировалось stabud; 19.05.2013 в 21:50.
    Ответить с цитированием  
     

  5. #4  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,927
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    Хоть заново бери учебники и учись.
    Это бесполезно, те знания которые ты знал - скорее всего догонишь легко, а те которые проласосил
    навряд ли. Я вот тоже пару лет назад хотел дискретку выучить(в универе потому что ласосил), сел
    первые 3-4 параграфа прочитал и понял что мозг отказывается хавать эту информацию. Видимо
    нужна нормальная литература, у меня какие-то паршивые книги.

    DIM Ln1Ugol!, Ln2Ugol!, Ln3Ugol!, Ln4Ugol! <- что это
    Это углы для уравнения линии. Движок построен на теореме расстояния от точки до прямой линии.
    Это курс линейной алгебры самое простое оттуда.

    DIM a1!, a2!, a3!, a4!, b1!, b2!, b3!, b4! <- что это
    Это коэф-ты для уравнения, если честно уже подзабыл, т.к. разработал двиг и забыл, документации
    на тот момент не было.

    DIM CamX!, CamY!, CamZ!, CamHcrn!, CamVcrn! <- это тоже
    CamZ! - Высота камеры
    CamX!, CamY! - положение камеры на горизонтальной плоскости

    CamHcrn! - поворот камеры лево\право в радианах
    CamVcrn! - крен камеры верх\низ в радианах (больше нуля - верх, меньше нуля - низ)

    Принцип:
    Раздвигаю 2 линии на определённый угол обзора(OBZORh - по горизонтали, OBZORv - по вертикали),
    допустим между линиями точка, измеряем расстояние от первой линии до точки и также от второй
    линии до точки. Дальше всё просто нам нужно получить из этих расстояний число от нуля до единицы,
    которое будет характеризовать положение от левой границы экрана до правой - по горизонтали.
    Тоже самое проделываем по вертикали. Таким макаром мы проецируем трёхмерные координаты в
    двумерные.

    Вот как в моём движке ищется это значение:

    Код qbasic:
        OBRas1! = ABS(Rasst1!) + ABS(Rasst2!)
        IF OBRas1! <> 0 THEN XeKf# = Rasst1! / OBRas1! ELSE XeKf# = 1

    В итоге в XeKf# лежит число от нуля до единицы, если ноль то точка в самом левом положении на экране
    если единица, то в самом правом, а если .5 то посередине.

    В вордовском документе написано, какие вычисления нужно делать каждый кадр, а какие нет.
    Движок кстати очень медленный(просто я уж очень хотел написать свой), есть проекции двумя строчками,
    чуть позже найду.
    На 1-м курсе я писал курсач(мне помогали) там был хороший добротный(быстрый) 3D движок. Мой двиг плох
    тем, что с отсечением текстур можно неслабо оласоситься. Вращение точек можно использовать такое как
    у меня, оно быстрее уже не будет, если матрицей - то ещё больше считать.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  6. Пользователь сказал cпасибо:

    stabud (19.05.2013)

  7. #5  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    783
    Сказал(а) спасибо
    326
    Поблагодарили 347 раз(а) в 274 сообщениях
    Записей в блоге
    6
    Это бесполезно, те знания которые ты знал - скорее всего догонишь легко, а те которые проласосил
    навряд ли.
    Скорее всего так и есть. Наверно мозг с возрастом утрачивает способность к самообучению и акцентируется на каких-то других задачах. Но все равно спасибо что уделил время. Буду пытаться, по крайней мере принцип преобразования координат понятен.
    Ответить с цитированием  
     

  8. #6  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,927
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    фффф. еле нашёл, поиск по форуму не пашет у меня, темы древние сильно.
    Вот тут человек просил прокомментировать код, основные моменты я проанализировал.

    http://www.cyberforum.ru/qbasic/thread261437.html

    Вот эта проекция в том коде:
    Код qbasic:
       x1(i) = x(i) * (400 - z(i)) / 300
       y1(i) = y(i) * (400 - z(i)) / 300

    Ещё помню я решил ради прикола сравнить свою и эту проекцию, был где-то код, с вращающимися
    двумя кубиками, который я подгонял даже по осям . Не знаю смогу ли найти его, попробую, давно
    это было.

    Если сказать по современным движкам, то у них ось Z направлена вглубь(от наблюдателя), ось Y
    вверх, а ось X направо. Т.е. OX, OY соответствуют общепризнаным математическим координатам на
    плоскости (где OY вверх).

    Часто в современных двигах сцены рисуют треугольниками(их называют фейсы - Faces), для которых
    нужно вычислять нормали (нормали используются для вычисления освещённости грани), если не
    вычислить нормаль - то будут чёрные треугольники. У меня был код на PureBasic где я вычислял
    нормали, там было 2 способа первый мой и самый идиотский - я методом приближений(аппроксимаций)
    огромным количеством итераций вычислял нормаль. Второй метод я нашёл в интернете, это было
    несколько формул, которые сразу давали нормаль. Прогу попробую найти, т.к. код пылится где-то, мне
    от него всё равно толку никакого(т.к. не занимаюсь этим), а тебе или ещё кому может быть быть полезен.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  9. Пользователь сказал cпасибо:

    stabud (20.05.2013)

  10. #7  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,927
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    Нашёл первый код QBasic\QuickBasic:
    Видишь, что код старый, всё с постфиксами, 3D двиг я в 2008-м написал, подгонял когда увидел
    на форуме тот код.

    Код qbasic:
     CONST pi = 3.141592653589793#
     CONST Gradus = pi / 180, RAD = 180 / pi
        '  Углы обзора
        '  Разрешение экрана
        CONST OBZORh = 40 * Gradus, OBZORv = 33 * Gradus
        CONST RezX = 319, RezY = 199
        CONST RezXDiv = RezX \ 2, RezYDiv = RezY \ 2
        '  Геометрия
        CONST Points = 8   ' Точек
        CONST Polygs = 6   ' Полинонов
        CONST Ps = Points - 1, Pg = Polygs - 1
     '  Переменные 3D движка
     DIM Ln1Ugol!, Ln2Ugol!, Ln3Ugol!, Ln4Ugol!
     DIM a1!, a2!, a3!, a4!, b1!, b2!, b3!, b4!
     DIM CamX!, CamY!, CamZ!, CamHcrn!, CamVcrn!
        '  Точки
        DATA 0,0,500
        DATA 500,0,500
        DATA 500,500,500
        DATA 0,500,500
        DATA 0,0,0
        DATA 500,0,0
        DATA 500,500,0
        DATA 0,500,0
     DIM X%(Ps), Y%(Ps), Z%(Ps), ex%(Ps), ey%(Ps), DalT%(Ps)
     DIM Xc%(Ps), Yc%(Ps), Zc%(Ps)
     DIM ex2%(Ps), ey2%(Ps)
     DIM KubU#, KubV#
     FOR i% = 0 TO Ps: READ X%(i%), Y%(i%), Z%(i%): NEXT
       '  Центруем объект
     DIM xMax%, yMax%, zMax%, xMin%, yMin%, zMin%, CntX%, CntY%, CntZ%
     FOR i% = 0 TO Ps
      IF xMax% < X%(i%) THEN xMax% = X%(i%)
      IF xMin% > X%(i%) THEN xMin% = X%(i%)
      IF yMax% < Y%(i%) THEN yMax% = Y%(i%)
      IF yMin% > Y%(i%) THEN yMin% = Y%(i%)
      IF zMax% < Z%(i%) THEN zMax% = Z%(i%)
      IF zMin% > Z%(i%) THEN zMin% = Z%(i%)
     NEXT
     CntX% = (xMax% - xMin%) \ 2
     CntY% = (yMax% - yMin%) \ 2
     CntZ% = (zMax% - zMin%) \ 2
     FOR i% = 0 TO Ps
       X%(i%) = X%(i%) - CntX%
       Y%(i%) = Y%(i%) - CntY%
       Z%(i%) = Z%(i%) - CntZ%
     NEXT
     FOR i% = 0 TO Ps: Xc%(i%) = X%(i%): Yc%(i%) = Y%(i%): Zc%(i%) = Z%(i%): NEXT
      '  Полигоны
    DATA 0,1,2,3
    DATA 7,6,5,4
    DATA 0,3,7,4
    DATA 2,1,5,6
    DATA 1,0,4,5
    DATA 3,2,6,7
      '  Pnum% - грани
        DIM Pnum%(Pg, 3)
          FOR i1% = 0 TO Pg: FOR i2% = 0 TO 3
            READ Pnum%(i1%, i2%)
          NEXT i2%, i1%
     
      ' Инициализация
    SCREEN 7, , 0, 1
       LOCATE 14, 10: COLOR 15: PRINT "PRESS SPACE...    "
       PCOPY 0, 1  ' Сразу откопируем страницу(для надписи)
      DO: LOOP UNTIL INKEY$ = CHR$(32)
     
      ' Считаем это перед циклом по кадрам (Не надо считать каждый раз)
       Ln1Ugol! = OBZORh: Ln2Ugol! = -OBZORh
       Ln3Ugol! = OBZORv: Ln4Ugol! = -OBZORv
       a1! = SIN(Ln1Ugol!): b1! = -COS(Ln1Ugol!)
       a2! = SIN(Ln2Ugol!): b2! = -COS(Ln2Ugol!)
       a3! = SIN(Ln3Ugol!): b3! = -COS(Ln3Ugol!)
       a4! = SIN(Ln4Ugol!): b4! = -COS(Ln4Ugol!)
     
     ' Параметры камеры
     CamHcrn! = 0 * Gradus   ' Крен камеры
     CamVcrn! = 0 * Gradus   ' Поворот камеры
     CamX! = -800
     CamY! = 0
     CamZ! = 0
     FirstTime! = TIMER
     
    DO  ' Основной цикл по кадрам
      WHILE TIMER = FirstTime!: WEND: FirstTime! = TIMER
      tic% = tic% + 1
        ' Делаем эти 2 строчки каждый раз, когда меняем углы камеры
      SinCamH! = SIN(CamHcrn!): CosCamH! = COS(CamHcrn!)
      SinCamV! = SIN(CamVcrn!): CosCamV! = COS(CamVcrn!)
        ' Углы вращения куба по таймеру
     KubU# = KubU# + CDBL(1 * tic%) * Gradus    ' Горизонтальная плоскость
     KubV# = KubV# + CDBL(3 * tic%) * Gradus    ' Вертикальная плоскость
     tic% = 0
        ' Вращаем куб
     FOR Tn% = 0 TO 7
      XcP# = CDBL(X%(Tn%)) * COS(KubU#) - CDBL(Y%(Tn%)) * SIN(KubU#)
      Yc%(Tn%) = CDBL(X%(Tn%)) * SIN(KubU#) + CDBL(Y%(Tn%)) * COS(KubU#)
      Zc%(Tn%) = -XcP# * SIN(KubV#) + CDBL(Z%(Tn%)) * COS(KubV#)
      Xc%(Tn%) = XcP# * COS(KubV#) + CDBL(Z%(Tn%)) * SIN(KubV#)
     NEXT
        ' Цикл по точкам(вершинам)
      FOR i% = 0 TO 7
       TXx! = Xc%(i%) - CamX!: TYy! = Yc%(i%) - CamY!: TZz! = Zc%(i%) - CamZ!
        ' Обратный поворот относительно 2х осей
       TX! = TXx! * CosCamH! + TYy! * SinCamH!    ' Первая плоскость XY
       TY! = -TXx! * SinCamH! + TYy! * CosCamH!
        ' Вторая плоскость XZ
       TZ! = -TX! * SinCamV! + TZz! * CosCamV!  'Сперва Tz ВАЖНО !!!
       TX! = TX! * CosCamV! + TZz! * SinCamV!
     
        ' Моё проецирование
        ' Расчёт горизонтального расстояния
      Rasst1! = (a1! * TX! + b1! * TY!)
      Rasst2! = (a2! * TX! + b2! * TY!)
        IF Rasst1! < 0 OR Rasst2! > 0 GOTO Ex3D   'Точка вне видимости
        OBRas1! = ABS(Rasst1!) + ABS(Rasst2!)
        IF OBRas1! <> 0 THEN XeKf# = Rasst1! / OBRas1! ELSE XeKf# = 1
        ex%(i%) = XeKf# * RezX
        ' Расчёт вертикального расстояния
      Rasst3! = (a3! * TX! + b3! * TZ!)
      Rasst4! = (a4! * TX! + b4! * TZ!)
        IF Rasst3! < 0 OR Rasst4! > 0 GOTO Ex3D   'Точка вне видимости
        OBRas2! = ABS(Rasst3!) + ABS(Rasst4!)
        IF OBRas2! <> 0 THEN YeKf# = Rasst3! / OBRas2! ELSE YeKf# = 1
        ey%(i%) = YeKf# * RezY
    Ex3D:
       
        '  Это чужое проецирование (Куб с зелёной гранью)
        '  Подогнано под оси и проецирование моего движка
        Dist! = 150: Dist2! = 1
        ex2%(i%) = RezXDiv - ((TY! * Dist!) / (TX! + Dist2!)) * 1.27
        ey2%(i%) = RezYDiv - ((TZ! * Dist!) / (TX! + Dist2!)) * 1.01
        '  _____________________________________________
      NEXT i%
        ' Очистка заднего буфера
      CLS 1
        ' Построим полигоны
      FOR i% = 0 TO 5
        Px1% = Pnum%(i%, 0): Px2% = Pnum%(i%, 1)
        Px3% = Pnum%(i%, 2): Px4% = Pnum%(i%, 3)
        '  Чужой кубик (с зелёной гранью)
        LINE (ex2%(Px1%), ey2%(Px1%))-(ex2%(Px2%), ey2%(Px2%)), 10
        LINE (ex2%(Px2%), ey2%(Px2%))-(ex2%(Px3%), ey2%(Px3%)), 7
        LINE (ex2%(Px3%), ey2%(Px3%))-(ex2%(Px4%), ey2%(Px4%)), 7
        LINE (ex2%(Px4%), ey2%(Px4%))-(ex2%(Px1%), ey2%(Px1%)), 7
        '  Моё кубик (с красной гранью)
        LINE (ex%(Px1%), ey%(Px1%))-(ex%(Px2%), ey%(Px2%)), 12
        LINE (ex%(Px2%), ey%(Px2%))-(ex%(Px3%), ey%(Px3%)), 15
        LINE (ex%(Px3%), ey%(Px3%))-(ex%(Px4%), ey%(Px4%)), 15
        LINE (ex%(Px4%), ey%(Px4%))-(ex%(Px1%), ey%(Px1%)), 15
      NEXT
      '  Копируем страницу
      PCOPY 0, 1
    LOOP UNTIL INKEY$ = CHR$(27) ' Выход по ESC

    Другой код про нормали тоже должен быть недалеко, постараюсь сгружать всё ценное и полезное
    по 3D сюда, чтобы тема была ёмкой.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  11. Пользователь сказал cпасибо:

    stabud (20.05.2013)

  12. #8  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,927
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    Вот мои проги на пюре, это когда я пытался там расшерстить работу с 3D. Это было в версии 4.51,
    и 3D там было мягко говоря - неважное, сейчас в новых версиях они там как раз упор на 3D сделали
    и добавили кучу недостающих функций, судя по тому, что писали люди на форумах.

    В Cube2.pb можно найти процедуру добавления фейса, я тут подзабыв ляпнул, что нормаль
    считается для фейса, короче говоря НЕТ - нормаль считается для каждой вершины.
    На самом деле треугольники должны состоять из точек рядом лежащих, и несколько треугольников
    в идеале должны использовать одни и те же вершины, для которых посчитаны нормали, именно
    тогда освещение будет работать "мягко". А в этом коде я просто добавляю треугольник и отдельные
    3 вершины, для которых считаю нормаль перпендикулярную плоскости треугольника. Закладывая
    таким макаром модель на "мягкое" освещение можно не надеяться. Поэтому лучше закладывать
    модели в 3D редакторах которые содержат хорошие алгоритмы рассчёта нормалей и оптимизации
    модели(использование фейсами одних и тех же вершин).

    *.dll для запуска экзешников, закинуть в директорию с *.exe ( на форум не влезло и не сжимается )
    http://rghost.ru/46125588
    Вложения
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  13. Пользователь сказал cпасибо:

    stabud (20.05.2013)

  14. #9  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    783
    Сказал(а) спасибо
    326
    Поблагодарили 347 раз(а) в 274 сообщениях
    Записей в блоге
    6
    Нашёл первый код QBasic\QuickBasic:
    Видишь, что код старый, всё с постфиксами, 3D двиг я в 2008-м написал, подгонял когда увидел
    на форуме тот код.
    Он запускается на FB , только работает слишком быстро. Пытался поставить sleep(1) , тогда вообще не дождешься пока прокрутится. Я правда при sleep(1) зажал клавишу Space - на моем компе скорость как надо . В принципе не в этом дело. Я где-то видел подобный пример на забугорном форуме на чистом FB. Но этот великолепен тем, что все прокомментировано на нашем, буду разбираться.
    *.dll для запуска экзешников, закинуть в директорию с *.exe ( на форум не влезло и не сжимается )
    Да и без него запускается, видать в директории пура где-то лежит у меня. Благодарю.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Книга: СТЕПЛЕР. Язык программирования.
    от Kakos_nonos в разделе Степлер
    Ответов: 12
    Последнее сообщение: 23.03.2013, 06:43
  2. Есть ли тут джедаи?
    от Кертис в разделе Assembler
    Ответов: 5
    Последнее сообщение: 18.11.2011, 16:24
  3. Определить какое время больше
    от pingvin в разделе C/C++
    Ответов: 4
    Последнее сообщение: 22.04.2011, 12:21
  4. программа работает, но есть вопрос
    от чес в разделе Turbo Pascal
    Ответов: 9
    Последнее сообщение: 15.04.2011, 20:25
  5. Есть ли аналог $INCLUDE в QBasic
    от uav1606 в разделе QBasic
    Ответов: 4
    Последнее сообщение: 16.02.2011, 04:23
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •