Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.202.4] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Сразу к делу: Я нарисовал параболоид (обычный, не элептический и еще какой-то), и мне надо добавить к нему освещение. Реализация освещения на языке С++. Буду благодарен за помощь.[attach=#0][/attach]
|
Сообщ.
#2
,
|
|
|
Вычисляешь нормаль в каждой точке, умножаешь скалярно на вектор направления на источник света. Полученная величина - яркость диффузного освещения.
|
Сообщ.
#3
,
|
|
|
Если честно то я ничего не понял
|
Сообщ.
#4
,
|
|
|
Освещение - достаточно неоднозначная вещь, существует масса моделей освещения. Одна из самых простых из них - диффузная. В ней предпорлагается, что отраженный свет равномерно рассеивается во все стороны.
Именно этот вариант тебе и предложен. Все остальные слова, вроде, должны быть понятны. Если нет - задавай конкретные вопросы. Собственно, выше все изложено правильно, есть только одна неточность (точнее, отсутствие оговорки) - вместо отрицательной величины берется 0. |
Сообщ.
#5
,
|
|
|
Я по пользовался гуглом и впринципи понял для чего нужно освещение. По поводу предложенного решения, я (извинаюсь за то что такой тупой) не понял по какой формуле можно это вычеслить
|
Сообщ.
#6
,
|
|
|
Задаёшь структуру Vector с тремя float полями - x, y, z.
Задаёшь переменную sun типа Vector для направления на источник света, записываешь туда какое-нибудь выбранное значение, оно должно быть нормализованным, то есть его длина равна 1: sun.x*sun.x+sun.y*sun.y+sun.z*sun.z == 1 При рисовании поверхности в каждой рисуемой точке вычисляешь нормаль N, то есть перпендикуляр к поверхности, это тоже вектор, и он тоже должен быть нормализован. Находишь скалярное произведение sun и N: float dot = sun.x*N.x + sun.y*N.y + sun.z*N.z; Если получается dot<0, то приравниваешь dot к нулю, это - яркость данной точки. |
Сообщ.
#7
,
|
|
|
Задаёшь структуру Vector с тремя float полями - x, y, z.
Задаёшь переменную sun типа Vector для направления на источник света, записываешь туда какое-нибудь выбранное значение, оно должно быть нормализованным, то есть его длина равна 1: Эта часть не совсем понятна. И еще по поводу вычисления нормали в каждой точке. У меня рисуется все следующим образом: #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(); } //--------------------------------------------------------------------------- |
Сообщ.
#8
,
|
|
|
структуру Vector с тремя float полями - x, y, z. создал. Вопрос как задать переменную sun типа Vector?
|
Сообщ.
#9
,
|
|
|
Цитата kosetsky @ Вопрос как задать переменную sun типа Vector? Vector sun; |
Сообщ.
#10
,
|
|
|
Написал следующее
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 |
Сообщ.
#11
,
|
|
|
Потому что char не float-point type
|
Сообщ.
#12
,
|
|
|
ой не char a float
Добавлено Переделал так struct Vector { float * x; float * y; float * z; }; Vector sun; sun.x = 115; sun.y = 126; sun.z = 123; ошибка Cannot convert int to float |
Сообщ.
#13
,
|
|
|
Сам не догадываешься?
|
Сообщ.
#14
,
|
|
|
К сожелению нет
|
Сообщ.
#15
,
|
|
|
Вектор состоит из float'ов, а не указателей на оные, как у тебя.
|