Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Alex Astafiev                        2:5000/228.16  18 Mar 2002  10:51:30
 To : Vitaly Gorbukov
 Subject : Алгоритм рисования поверхности планеты
 -------------------------------------------------------------------------------- 
 
 
  VG> Требуется сабж.
  VG> Есть исходный маленький размер планеты (40х40 точек), по которому
  VG> нужно создать крупный план (400х400) блюр, размытие не подходят, нужно
  VG> сгенерить поверхность учитывая расположение пикселей в маленьком
  VG> изображении, т.е. чтобы при уменьшении большого плана (400х400)
  VG> получалось малое изображение (40х40), наверное нужно еще учитывать что
  VG> используется палитровый режим (256), и под количество цветов на
  VG> изображение планеты должно отводиться как можно меньше цветов (можно
  VG> использовать только палитру набора файла содержащего
  VG> некоторое множество планет), есть функция которая возвращает номер
  VG> цвета в палитре соответствующего ближайшему RGB цвету (24 бита). приму
  VG> любое описание, от словесного до паскаля и си (только си без извратов)
 
 вопрос поставлен некорректно.
 что следует понимать под - 'Есть исходный маленький размер планеты' ?
 планета - двумерный текстурированый круг? трехмерный теукстурированый шар?
 неверно ты понимаешь (ставишь) и вопрос с палитрой.
 тем не менее, попробую предложить тебе вариант построения изображения
 текстурированого "под планету" круга (кажущегося шара).
 
 Для того чтобы решить задачу в 2D-варианте, ее следует разбить на три этапа и
 решить три задачи
 1) Генерация реалистичной текстуры
 2) Передача искривления (курватуры) поверхности
 3) Квантование в палитру.
 
 Для усиления реалистчиности, на этапе 1 и 2 можно добавить освещение
 поверхности солнцем и рельеф, т.е. bumpmapping.
 1)
 Генерацию текстуры можно выполнить, имея большую текстуру 400x400 и получая из
 нее серию текстур с меньшей резолюцией методом супер-сэмплинга 2->1.
 
 Второй вариант, это использовать resampling изображения текстуры с помощью
 алгоритма ресэмплинга. простейший - алгоритм ближайшего соседа, nearest
 neighbor, более сложные - Line approx, Spline Approx. при этом можно
 использовать для повышения качества разные критерии ресэмплирования, например,
 Box, Trangle, Hermite, Bell, Spline, Lanczos, Mitchell.
 
 Третий вариант, самый интересный, это генерировать текстуру процедурно,
 введя коэффициенты масштабирования в функцию генерации текстуры.
 Здесь замечательно будет работать Perlin Noise с градиентом мэппинга функции в
 цвет а-ля "географик". При этом у тебя сгенерятся и облака, и горы, итп...
 Hедостаток метода - ресурсоемкость и трудность релизации. Требует долгой игры с
 параметрами perlin noise - функции.
 
 Hаконец, для усиления реалистичности, можно сделать поверх текстуры легкий
 BumpMapping
 
 2)
 Поверхность планеты на самом деле искривлена, поэтому текстуру следует
 искривить с учетом перспективы. Алгоритм Lens здесь подходит более всего. Либо,
 следует просто протрассировать простейшим raytracing точки круга.
 Я бы остановился на raytracing. Это к тому же, поможет сделать "освещение"
 сферы и BumpMapping. Выглядит это примерно так:
 
 void drawsphere(int cx, int cy, int r, int LightX, int LightY, int LightZ)
 {
     float s, y1, y2;
     int Color;
 
     float lx = LightX - cx;
     float ly = LightY - cy;
     float lz = LightZ;
 
     float l = sqrt(lx*lx + ly*ly + lz*lz);
     lx = lx / l;
     ly = ly / l;
     lz = lz / l;
 
     for (int y = -r; y <= r; y++) {
         y1 = r*r - y*y;
         y2 = y*ly;
         for (int x = -r; x <= r; x++) {
             s = y1 -x*x;
             if (s >=0) {
                 Color =  (int)(0.5 + 255.0*(x*lx + y2 + sqrt(s)*lz) / r);
                 if (Color >= 0 && Color <= 255)
                     setpixel(x+cx, y+cy, Color);
                 else
                     setpixel(x+cx, y+cy, 0);
             }
         }
     }
 }
 
 (синтакс не проверял, написано от руки.)
 3) перевод полученого RGB-изображения в палитровый режим с известной, уже
 заданой палитрой. Это решается любым из способов квантования цвета
 (дайзеринга). См, напрмер, мое письмо к Alexey Malov (Vivid^Brainwave) с
 исходником Color Quantizer.
 
 p.s
 В 3D вопрос решается иначе. но это уже другая тема.
 ---
  * Origin: Alex Raider/ Flash inc. 1992-2002 (2:5000/228.16)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Алгоритм рисования поверхности планеты   Vitaly Gorbukov   16 Mar 2002 22:55:07 
 Алгоритм рисования поверхности планеты   Alex Astafiev   18 Mar 2002 10:51:30 
 Алгоритм рисования поверхности планеты   Alexandr Brezgin   19 Mar 2002 17:42:00 
Архивное /ru.algorithms/174643c95c190.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional