Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Я код на C++ набрал сам. Строил кривую Безье, но "прилипал" к нулю. То есть я задаю точки далеко от нуля, а он строил из нуля, а потом только обходил предложенные точки. Потом я нашёл Ваш сайт и эту статью. Оказалось, что я забыл возвести t в...
просто я не так понял, здесь мы вращаем точки куба что вращает сам куб. Мне нужно вращать просто 3д объект , данный способ не подходит
Задавайте объект в мировых координатах. Вращайте его относительно мировой системы координат. А при отрисовке преобразуйте в экранные координаты. Посмотрите пример преобразования в экранные координаты.
Это вращение по мировым осям ? Если да то как сделать по осям объекта ?
Добрый вечер! Область прорисовки остается пустой. Чего-то не хватает. Объясните плз, чего? Рамиль.

Счетчики и рейтинг

Рейтинг@Mail.ru
Скриншот к примеру
Среда программирования: 
Lazarus 1.2.6 win32/win64
Статья по теме: 

Программа демонстрирует построение шара, освещенного источником света. Используются формула построения шара, перспективная проекция и модель освещения Ламберта.

По нажатию на кнопку "Draw" начинается построение.

Код программы: 

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    procedure Rastr( x,y,z: Double ); // Процедура растеризации в экранные координаты
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
Var x,y,z: Double ;
begin
  // Расчет координат x,y,z по уравнению сферы. Растеризация каждой точки
  x:=-1;
  while x<=1 do begin
    y:=-1;
    while y<=1 do  begin
      if 1-x*x-y*y >= 0 then begin
        z := sqrt(1-x*x-y*y);
        Rastr(x,y,z);
      end;
      y := y+0.003;
    end;
    x := x+0.003;
  end;
end;
 
procedure TForm1.Rastr(x, y, z: Double);
Var xs, ys, zs: Integer; // экранные координаты
    Scale, k: Integer;  // масштаб и расстояние до наблюдателя
    I_D, lx,ly,lz: Double; // Координаты источника света и диффузное освещение
begin
   Scale:=200; // Масштаб
   k:=-5; // Расстояние до наблюдателя
   lx:=0.5; // Координаты источника света
   ly:=0.5;
   lz:=0.707107;
   // Перспективная проекция, масштаб и сдвиг в середину области рисования
   xs:= Round(k*x/(z+k)*Scale)+PaintBox1.Width div 2;
   ys:= Round(k*y/(z+k)*Scale)+PaintBox1.Height div 2;
   // Расчет рассеивающего освещения по формуле Ламберта
   I_D := (x*lx+y*ly+z*lz);
   if I_D > 0 then
     PaintBox1.Canvas.Pixels[xs,ys] := RGBToColor(0,0,Round(255*I_D))
   else
     PaintBox1.Canvas.Pixels[xs,ys] := RGBToColor(0,0,10); // Фоновое освещение
end;
 
end.  

Прикрепленный файлРазмер
Пример освещения по Ламберту854.29 кб