На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Освещение С++ , Нужна помощь
    Сразу к делу: Я нарисовал параболоид (обычный, не элептический и еще какой-то), и мне надо добавить к нему освещение. Реализация освещения на языке С++. Буду благодарен за помощь.[attach=#0][/attach]
      Вычисляешь нормаль в каждой точке, умножаешь скалярно на вектор направления на источник света. Полученная величина - яркость диффузного освещения.
        Если честно то я ничего не понял
          Освещение - достаточно неоднозначная вещь, существует масса моделей освещения. Одна из самых простых из них - диффузная. В ней предпорлагается, что отраженный свет равномерно рассеивается во все стороны.
          Именно этот вариант тебе и предложен.
          Все остальные слова, вроде, должны быть понятны. Если нет - задавай конкретные вопросы.
          Собственно, выше все изложено правильно, есть только одна неточность (точнее, отсутствие оговорки) - вместо отрицательной величины берется 0.
            Я по пользовался гуглом и впринципи понял для чего нужно освещение. По поводу предложенного решения, я (извинаюсь за то что такой тупой) не понял по какой формуле можно это вычеслить
              Задаёшь структуру Vector с тремя float полями - x, y, z.
              Задаёшь переменную sun типа Vector для направления на источник света, записываешь туда какое-нибудь выбранное значение, оно должно быть нормализованным, то есть его длина равна 1:
              ExpandedWrap disabled
                sun.x*sun.x+sun.y*sun.y+sun.z*sun.z == 1

              При рисовании поверхности в каждой рисуемой точке вычисляешь нормаль N, то есть перпендикуляр к поверхности, это тоже вектор, и он тоже должен быть нормализован.
              Находишь скалярное произведение sun и N:
              ExpandedWrap disabled
                float dot = sun.x*N.x + sun.y*N.y + sun.z*N.z;

              Если получается dot<0, то приравниваешь dot к нулю, это - яркость данной точки.
                Задаёшь структуру Vector с тремя float полями - x, y, z.
                Задаёшь переменную sun типа Vector для направления на источник света, записываешь туда какое-нибудь выбранное значение, оно должно быть нормализованным, то есть его длина равна 1:



                Эта часть не совсем понятна. И еще по поводу вычисления нормали в каждой точке. У меня рисуется все следующим образом:
                ExpandedWrap disabled
                  #include "Unit1.h"
                  #include <iostream.h>
                  #include <stdio.h>
                  #include <conio.h>
                  #include <windows.h>
                   
                  //---------------------------------------------------------------------------
                  #pragma package(smart_init)
                  #pragma resource "*.dfm"
                  TfrmMain *frmMain;
                   
                   
                  void drawParabola(int x0, int y0, int radius, bool is_pause = false) {
                          int x = 0;
                          int y = radius;
                          int delta = 2 - 3 * radius;
                          int error = 0;
                          while(y >= 0) {
                   
                                  frmMain->Canvas->Pixels[x0 + x][y0 + y*2] = clBlack;
                                  //frmMain->Canvas->Pixels[x0 + x][y0 - y*2] = clBlack;
                                  frmMain->Canvas->Pixels[x0 - x][y0 + y*2] = clBlack;
                                  //frmMain->Canvas->Pixels[x0 - x][y0 - y*2] = clBlack;
                   
                   
                                  //
                                  error = 2 * (delta + y) - 1;
                                  if (delta < 0 || error <=0 ) {
                                          ++x;
                                          delta += 2 * x + 1;
                                          continue;
                                  }
                                  error = 2 * (delta - x) - 100;
                                  if(delta > 0 || error > 3) {
                                          --y;
                                          delta += 2 - 3 * y;
                                          continue;
                                  }
                            //      ++x;
                             //     delta += 2 * (x - y);
                            //      --y;
                   
                   
                            if (is_pause) Sleep(10);
                            Application->ProcessMessages();
                            //frmMain->Refresh();
                          }
                  }
                   
                   
                   
                   
                  __fastcall TfrmMain::TfrmMain(TComponent* Owner)
                          : TForm(Owner)
                  {
                  }
                  //---------------------------------------------------------------------------
                   
                  void __fastcall TfrmMain::Button2Click(TObject *Sender)
                  {
                  drawParabola(180,100,80);
                  int x = 180;
                  for (int y = 100; y <= 190; y ++) {
                          drawParabola(x,y,80);
                          x ++;
                   }
                  }
                  //---------------------------------------------------------------------------
                   
                   
                   
                  void __fastcall TfrmMain::Button3Click(TObject *Sender)
                  {
                  frmMain->Repaint();
                  }
                  //---------------------------------------------------------------------------
                  структуру Vector с тремя float полями - x, y, z. создал. Вопрос как задать переменную sun типа Vector?
                    Цитата kosetsky @
                    Вопрос как задать переменную sun типа Vector?

                    ExpandedWrap disabled
                      Vector sun;
                      Написал следующее
                      ExpandedWrap disabled
                        struct Vector {
                        char * x; char * y; char * z;
                        };
                         
                         
                        Vector sun;
                        sun.x = 115.0;
                        sun.y = 126.0;
                        sun.z = 123.0;


                      выдает ошибку: Illegal use of floating point
                        Потому что char не float-point type
                          ой не char a float

                          Добавлено
                          Переделал так
                          ExpandedWrap disabled
                            struct Vector {
                            float  * x; float  * y; float  * z;
                            };
                             
                            Vector sun;
                            sun.x = 115;
                            sun.y = 126;
                            sun.z = 123;


                          ошибка Cannot convert int to float
                            Сам не догадываешься?
                              К сожелению нет
                                Вектор состоит из float'ов, а не указателей на оные, как у тебя.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0373 ]   [ 15 queries used ]   [ Generated: 27.04.24, 22:03 GMT ]