Система частиц на PHP в 3D

    С детства есть у меня заветная программерская мечта — написать физический движок. Как и положено мечте, я к ней никогда близко не подходил. Но однажды выдалась пара ночей, когда я должен был дежурить в помещении, и у меня с собой был ноутбук.
    В общем, взялся я моделировать движение и столкновение частиц на PHP. Почему на PHP? Потому что это единственный язык, на котором я могу свободно излагать свои программерские мысли. В общем, сначала координаты выводились в консоли, потом стал делать графические снимки. Немедленно появилась мысль генерировать анимацию…
    image


    Погуглив, я нашел древненький класс GIFEncoder v.2, который позволял собирать кадры в фильм! Меня это очень воодушевило, и я продолжил эксперименты.
    Самой первой, сложной и главной проблемой стало сложение импульсов. Дело в том, что при простом перемещении частицы на X, например, 1, и такой же Y, разбросанные во все 360 сторон частицы не хотели образовывать круг — они упорно выстраивались в ромб. Я плохо учил алгебру, но мне было интересно импровизировать, экспериментируя с коэффициентами.
    Второй проблемой стала проекция разбросанных в 3D точек на плоскость. Так как геометрию я учил не лучше алгебры, меня выручили импровизированные коэффициенты: с правильными подобрать более-менее правдоподобную проекцию было бы не просто. Так или иначе, энтузиазма хватило до создания скрипта, генерирующего вышеприведенный ролик. А механизм лучше всего объяснить прямо в коде. Вы должны свободно читать и понимать PHP:
    <?php
    // В зависимости от задачи, может выполняться и пару часов =)
    set_time_limit(0);
    // засекаем время
    $start = microtime(1);
    // GIFEncoder вот отсюда:
    // http://saintist.ru/2009/05/12/316/
    include('gif_animate.php');
    
    // Пространство для дивжения частиц
    class space {
        // хранилище частиц
        public $points = array();
        // вместо матрицы - свойства
        // с объектным интерфейсом матрица не нужна
        private $x;
        private $y;
        private $z;
        // Шаги. См. метод step.
        public $steps = 0;
    
        public function __construct($x, $y, $z) {
            $this -> x = $x;
            $this -> y = $y;
            $this -> z = $z;
        }
    
        // -да будет частица...
        public function addPoint($point, $x, $y, $z, $fx = 0, $fy = 0, $fz = 0) {
            array_push($this -> points, array($point, $x, $y, $z));
            $point -> addP($fx, $fy, $fz);
        }
    
        // Шаг. Ключевой элемент, в этом методе двигаются частицы.
        // В какой-то версии скрипта, они у меня сталкивались.
        // Чтобы они (на случай - если столкновения включены) не прыгали сквозь друг друга,
        // шаги могут быть дробными. Число, которым выражен шаг = скорости самой медленной
        // частицы, но только если она < 1.
        // Изначально, 1 шаг = перемещение частицы со скоростью 1 на 1 пиксель за шаг.
        // Поэтому дробное число можно считать частью шага.
        public function step() {
            // вот этим числом выражен шаг
            $t = 1;
            // Матрица занятых координат.
            // Использовалась для поиска столкновений, далее не используется.
            $busy = array();
            // В этом цикле чистим space от вылетевших за пределы поля частиц
            // и вычисляем величину шага
            foreach ($this -> points as $n => &$point) {
                $x = $point[1];
                $y = $point[2];
                $z = $point[3];
                // Если частица за пределами поля - удаляем её, и пропускаем итерацию
                if (!($x >= 0 && $x < $this->x && $y >= 0 && $y < $this->y && $z >= 0 && $z < $this->z)) {
                    unset($this->points[$n]);
                    continue;
                }
                // Сила импульсов частицы в трех измерениях
                $f = abs($point[0]->p['fx']) + abs($point[0]->p['fy']) + abs($point[0]->p['fz']);
                // Если она вообще движется, и при том меньше 1 и текущей $t
                if ($f > 0 && 1 / $f < $t) {
                    // то меняем числовое выражение шага
                    $t = 1 / $f;
                }
            }
            // Главный цикл. Перемещение частиц.
            foreach ($this -> points as $n => &$point) {
    
                $xyz = abs($point[0]->p['fx']) + abs($point[0]->p['fy']) + abs($point[0]->p['fz']);
                // Экспериментально вывел этот коэффициент для сложения импульсов
                $hypo = pow(abs($point[0]->p['fx']), 2) + pow(abs($point[0]->p['fy']), 2) + pow(abs($point[0]->p['fz']), 2);
                // Переменные вида $move_x - это растояние, на которое должна быть перемещена частица.
                // Ниже они вычисляются.
                // Эта еденица для X и Y равна пикселю, для Z - визуально заметна только
                // при наличии импульса в X или Y, естественно.
                if ($point[0]->p['fx'] != 0 && $xyz > 0) {
                    if ($point[0]->p['fx'] < 0) {
                        $fxmin = 1;
                    }
                    $move_x = sqrt($hypo) * ($point[0]->p['fx'] / $xyz);
                    if (isset($fxmin)) $move_x = $move_x * -1;
                } else {
                    $move_x = 0;
                }
    
                if ($point[0]->p['fy'] != 0 && $xyz > 0) {
                    if ($point[0]->p['fy'] < 0) {
                        $fymin = 1;
                    }
                    $move_y = sqrt($hypo) * ($point[0]->p['fy'] / $xyz);
                    if (isset($fymin)) $move_y = $move_y * -1;
                } else {
                    $move_y = 0;
                }
    
                if ($point[0]->p['fz'] != 0 && $xyz > 0) {
                    if ($point[0]->p['fz'] < 0) {
                        $fzmin = 1;
                    }
                    $move_z = sqrt($hypo) * ($point[0]->p['fz'] / $xyz);
                    if (isset($fzmin)) $move_z = $move_z * -1;
                } else {
                    $move_z = 0;
                }
                // умножаем на длину шага и меняем координаты
                $point[1] += $move_x*$t;
                $point[2] += $move_y*$t;
                $point[3] += $move_z*$t;
            }
            $this -> steps+=$t;
        }
        // Метод делает снимок space в GIF
        public function shot() {
            $r = imagecreatetruecolor($this -> x+1, $this -> y+1);
            // думаю, все очевидно
            foreach ($this -> points as &$point) {
                $x = $point[1];
                $y = $point[2];
                $z = $point[3];
                if ($x >= 0 && $x < $this->x && $y >= 0 && $y < $this->y && $z >= 0 && $z < $this -> z) {
                    // оказывается, не всё. Нам надо, что частицы, которые дальше по Z
                    // двигались медленнее тех, что ближе к нам - по Z.
                    $ox = $this->x / 2;
                    $oy = $this->y / 2;
                    $oz = $this->z / 2;
                    $xf = $x - $ox;
                    $yf = $y - $oy;
                    $zf = $z;
                    $xr = $x - $xf / ($this->z/($this->z - $z));
                    $yr = $y - $yf / ($this->z/($this->z - $z));
                    imageline($r, $xr, $yr, $xr, $yr, $point[0]->color);
                }
            }
            ob_start();
            imagegif($r);
            return ob_get_clean();
        }
    }
    class Point {
        public $p = array('fx' => 0, 'fy' => 0, 'fz' => 0);
        public $color;
        // Конструктор генерирует случайный цвет
        public function __construct() {
            $red = dechex(rand(1, 255));
            if (strlen($red) < 2) $red = '0'.$red;
            $green = dechex(rand(1, 255));
            if (strlen($green) < 2) $green = '0'.$green;
            $blue = dechex(rand(1, 255));
            if (strlen($blue) < 2) $blue = '0'.$blue;
            $this->color = hexdec("0x$red$green$blue");
        }
        public function addP($fx = 0, $fy = 0, $fz = 0) {
            $this->p['fx'] += $fx;
            $this->p['fy'] += $fy;
            $this->p['fz'] += $fz;
        }
    }
    $gifs = array(); // GD-шные GIF-ы, которые потом будут объединены
    $space = new space(399, 399, 399, false, true);
    // Рандомно генерируем импульсы для частиц.
    // Чтобы они летели с разной скоростью, и в разных направлениях
    $rands = range(-10, 10, 0.5);
    for ($i=0; $i<1000; $i++) {
        // ... и стало так
        $space->addPoint(new Point, 200, 200, 200, $rands[array_rand($rands)], $rands[array_rand($rands)], $rands[array_rand($rands)]);
    }
    // запускаем на 100  ц е л ы х  шагов...
    while($space->steps < 100) {
        $nshot = $space -> steps;
        $space -> step();
        if ((int)$nshot < (int)$space -> steps) {
            array_push($gifs, $space -> shot());
            echo 'Step #',$space -> steps,"\r\n";
        }
    }
    // собираем кадры в фильм...
    $gif = new GIFEncoder($gifs, 0, 0, 0, 0, 0, 0, 'bin');
    
    file_put_contents('c:\anim.gif', $gif -> GetAnimation());
    echo "\r\nTime: ",substr(microtime(1) - $start, 0, 4);
    
    // приятного просмотра :-)
    

    Принцип вам понятен. Одним из первых роликов был этот:
    image
    Потом в 3D, этот:
    image
    Бред? Возможно. Но не бойтесь реализовывать самые бредовые идеи. Это — лучший способ научиться думать на языке программирования.
    Поделиться публикацией

    Похожие публикации

    Комментарии 83
      –50
      лучше девушку себе заведите :)
      зы: Я когда-то, давным-давно, на Дельфи подобным страдал
      зыы: лабиринт сделайте :)
        +15
        Девушка помогла тогда?
          +13
          нет, видимо
            0
            тогда не нашел, поэтому и страдал с Дельфи :)
            +13
            Да, дежурить по ночам на пару с подругой, конечно, веселее, но так и с работы попереть могут :)
              +3
              Наверное, shushu советовал девушку-программиста завести, чтобы разбиралась с физическими движками;)
            –31
            Что за мода кодить на языках, которые для конкретной задачи мягко говоря не приспособлены?
            Сначала веб-сайты на ЛNСPе, теперь вод анимация на PHP.
              +9
              Какая разница на чем писать, машинный код от этого не мутирует… пару регистров туда-сюда, а суть дела не меняет. Главное результат! В целом, автор любознательно-увлекательный человек, чем и порадовал:)
                0
                Даже если отбросить just for fun, то далеко не всегда издержки на освоение и развёртывание стэка новых ЯП/технологий/фреймворков/библиотек окупаются для разовых задач. Грубо говоря, зачем изучать Perl, если нужно один файл распарсить, или Erlang, если нужно чат написать?

                  +2
                  Почему бы не расширить свои горизонты? Кроме того изучение нового открывает преимущества — сайт на эрланге может оказаться гораздо более масштабируемым и отказоустойчивым, а на лиспе, как показала практика — легко выдерживать хабраэффект. Что же касается издержек — они перекрываются профитом от новых знаний и подходов
                    0
                    Разработка с использованием новых технологий, тем более новых парадигм не даёт возможности сколь нибудь точно оценить время на разработку в отличии от старых, проверенных. Что опять переносит область их использования в just4fun, по крайней мере для коммерческих решений с чётко ограниченными сроками риски могут быть неприемлемы, даже если время с запасом выделено. Проще, конечно, если в команде есть человек, уже ими владеющий, способный хотя бы ткнуть куда рыть, а вот полностью с нуля переходить…
                      0
                      Мы все когда-то учились ходить… Кому-то этого оказалось достаточно, а кто-то сел на велосипед. Не хотел бы я работать в одном коллективе с людьми, которые не хотят брать на себя риски, связанные с обучением новому.
                        0
                        Я говорил, прежде всего, о коммерческих разработках и рисках в масштабе фирмы. Согласитесь, что брать на себя, например, разработку сайта на рельсах с чётко ограниченными сроками, реальными для разработки php, когда никто из сотрудников не владеет даже основами руби, но все гуру php, несколько опрометчиво. Тем более, если берётся заказ на языке со совсем другой парадигмой.

                        И опять-таки, отдельные сотрудники изучают новые технологии «за свой счёт», если фирма это не оплачивает. Если оплачивает, значит она брёт риски на себя.
                  +4
                  А, вы, простите, phpфоб?
                  +16
                  Мда, теперь это на пхп делают.
                  А я такими вещами на Бейсике под DOS занимался. Фонтанчики, горящий огонь…
                    +29
                    > горящий огонь
                    внезапно
                    • НЛО прилетело и опубликовало эту надпись здесь
                        +2
                        Да, ещё бывают растаявший лёд, высохшая вода и съеденный обед. Но могут ли они «быть», если их, по факту, нет?

                        Gee, кажется мы тут готовы сформулировать новый парадокс обыденных вещей.
                      +1
                      Брат! Я тоже в своё время развлекался подобным на QBasic. Ещё игрушки простые делал.
                      А на PHP уже в универе писал эмулятор файловой системы ;)
                        +2
                        а я на js заодно мьютексы, симафоры, модельку перекрестка, нахождение пути (php), трассировка на плоскости (php)… ну и конечно любимая сортировка пузырьком из курса в курс =)
                          +2
                          Зачем мьютексы на JS? :)
                            0
                            ну статья же о just4fun + там было не совсем мьюетксы, а скорее демонстрация работы… если отковыряю в старых бекапах (это было 5 лет назад) — покажу
                            +1
                            И, если уж хвалитесь, поделитесь примером работы.
                        +15
                        А я считаю что автор молодец!
                          0
                          Автор рулит, Васька вообще гений в области программирования, он что 3D на РНР что 2D на OpenGL во всём шарит, он гений…

                          +1
                          Интенсивность запросов
                          изображения превысила
                          допустимый лимит.
                          Изображение временно
                          отключено.
                            +1
                            Vasya_Sh, используйте habreffect.ru/ для хостинга изображений
                              0
                              Спасибо, перезалил все изображения
                          0
                          Перезалейте самую первую фотку, пожалуйста
                            0
                            Я посоветую большее — перезалить все фотки на какой-нибудь хабреффект и никогда впредь не пользоваться говнохостингами типа радикала :)
                            0
                            Когда я в первый раз увидел первую картинку, мне показался кот, который с вытянутыми руками бежит на вас, а потом рассыпается. =)
                              +1
                              Заключение отличное!
                                –12
                                хабред. я таким в школе на бэйсике/VB страдал… вырастите рекурсивное дерево и умрите в экстазе!
                                  +3
                                  Сколько энтузиазизма!
                                  Да с таким можно горы свернуть!
                                  Особенно, если его направить в правильное русло, например в WebGL ( ru.wikipedia.org/wiki/WebGL )…
                                    +2
                                    Спасибо за наводку, на первый взгляд — гораздо проще и удобнее OpenGL
                                      0
                                      чем OpenGL
                                    0
                                    Шикарно, феерично, безумно! Дайте автору жирный плюс за меня.
                                      +1
                                      Когда напишите 3д шутер на пхп, скиньте исходники пжалста.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          +6
                                          Автор! Я даже придумал реальное применение твоему шедевру :)
                                          Попробуй реализовать из этого Captcha! А в следующем посте покажешь что получилось.
                                          Не ново, конечно, но на php я похожих проектов с анимированным исполнением не встречал.
                                            +1
                                            Вот это реальная идея!
                                              +1
                                              И что в этой капче будет революционно нового кроме анимации, в плане надежности?
                                                +1
                                                А это уже на усмотрение автора.
                                                Я лишь выразил идею по поводу применения.
                                                  –1
                                                  Задача распознавания для ботов будет усложнена?
                                                    0
                                                    А если рисовать по букве на кадре и fps повыше? Пользователь не особо заметит мерцания, а некоторые боты, по моему, кадр для распознавания выдергивают. От китайцев методика, конечно, не защищает.
                                                      0
                                                      Да, не заточенные боты будут видеть только первый кадр. Методику можно усложить, если прорисовывать буквы постепенно. Таким образом, ни на одном кадре не будет целых букв.
                                                      А пустое место заполнять шумом. Чтобы нельзя было получить четкие буквы, совместив все кадры в один.
                                                        +1
                                                        Можно с постепенного проявление добавить вращение проекции в 3D, состоящей из точек.
                                                        Я думаю, что если кто-то возьмётся распознать такую капчу, то бот скорее всего будет брать кадры из гифки и прогонять циклично каждый кадр с целью подбора наиболее подходящего.
                                                          +1
                                                          Ещё раз хочу выразить тебе респект!
                                                          Классно вышло.
                                                          Любая идея, даже просто ради развлечения или самореализации так или иначе имеет развитие. Нужно только найти угол с которого надо посмотреть на неё. Для программиста такие затеи — это как судоку решать или кроссворды. Ставишь перед собой задачу и делаешь, занимательно, интересно на самом деле.
                                                          Так держать!
                                                          +1
                                                          и на каждом 25 кадре рекламка ;)
                                                    +3
                                                    >Бред? Возможно. Но не бойтесь реализовывать самые бредовые идеи. Это — лучший способ научиться думать на языке программирования.

                                                    Полностью согласен с автором. На turbo pascal 7, в школе, я писал подобные вещи, помню самым сложным для меня было написание градиента, ну знаете, пиксельного =)

                                                    Придумывание и реализация подобных вещей позволяет полностью вникнуть в логику программирования, а то сейчас мода пошла знают <?php echo «Hello World!»?> и называют себя программистами, а попросишь перевести число в двоичную систему, сразу обзываются…
                                                      +3
                                                      Если экспериментировать надоест, рекомендую ознакомиться с одним из классических, но, пожалуй, самым простым методом
                                                      www.gamedev.ru/code/articles/PositionBasedPhysics

                                                        +2
                                                        Как тут все просто описано, а я в свое время долго мучилась с обменом импульсов тел.
                                                        0
                                                        PHP. Внезапно.
                                                          +14
                                                          бред бредом, но где то на 2-3 курсе меня приспичило написать 3д рендер ландшавтов на php — just4fun, и вроде даже не плохо получилось (кликабельно):

                                                          думал что это так и останется just4fun, когда внезапно на работе не потребовалась простенькая визуализация чертежей этажей здания (вытянуты из плоского вектора, крутятся, поэтому разрывы видны… ну и там еще плюшки типа выбора объекта, рисование пути прохода и т.д.):

                                                          это я к тому что ничто не проходит бесследно и любой just4fun — это куча экспы, которая позже может неплохо пригодиться =)
                                                            +3
                                                            Напишите статью, что ли, это ведь реально интересно.
                                                              +2
                                                              3D рендер в php/js? там всего 2 формулы нужны для отображения точек (x,y,z) на экране (x,y) + сортировка полигонов по Z координате (для рендера этажа вообще по Y сортировал заранее, так как угол наклона не меняется):
                                                              x_monitor=x*FOV/(z+FOV)
                                                              y_monitor=y*FOV/(z+FOV)
                                                              FOV это типа ширина угла обзора, сами формулы можно наращивать, например домножить на 0...0.9 — отдалим сцену или на 2...3...10 — приблизим сцену или делать сдвиг для перемещения всей сцены
                                                              конечно если надо написать полноценный движек, то формулы посложнее, но в целом я отталкивался от них =)
                                                              вращение наизусть не помню, а в коде нечто страшное, единственно что скажу — всякие синусы косинусы загоняйте сразу в массив (с нужным шагом угла) — в разы быстрее будет работать, нежели каждый раз высчитывать cos/sin заново для тех же самых углов поворота
                                                              ЗЫ: сейчас наверное ниже откоментят про матричные преобразования для вращения/сжатия/etc
                                                                +1
                                                                а еще у меня полигоном считается 4х угольник — это конечно неверно (надо треугольник), но так как все 4 точки находятся в одной плоскости, то это совершенно не критично, а рисовать на канве в 2 раза меньше
                                                                  +1
                                                                  Мда, каждый раз, когда читаю комментарии от людей «в теме», чувствую себя полным болваном :). Просто вы, описывая процесс в общих фразах, представляете его у себя в голове, а мне, например, неясны нюансы вроде сортировки полигонов и предшествующих этому этапах, как полигоны получаются и что содержат и т.д. Хотя, может, я один такой, увы, но имея на руках формулы про матричные преобразования, хотелось бы развернуто понять, как превратить их в горы, холмы и части здания на экране.
                                                                    +2
                                                                    не не, я не в теме на самом деле, просто где то давно нашел формулы и пользуюсь ими… в кратце (местами неверно для общих случаев типа написание мега движка):
                                                                    1) есть массив из полигонов, каждый полигон это многоугольник из 4х точек (квадрат, трапеция и т.д.), каждая точка задается 3мя координатами (x,y,z)
                                                                    2) делаем нужные нам преобразования, например вращение, получаем новый массив точек, где x y z уже новые, для ясности это у нас будет x' y' z'
                                                                    3) сортируем этот массив по z' (в данном случае находим среднее арифметическое между всеми z' для полигона=(z'1+z'2+z'3+z'4)/4), чтобы самый дальний объект был самым первым в массиве
                                                                    4) с помощью формул выше рисуем сцену: т.е. рисуем четырехугольник из глубины (т.к. на 3 шаге их так отсортировали)
                                                                    5) ну и собственно всё

                                                                    небольшие хитрости, баги и неточности для варианта выше:
                                                                    1) делаем 2 канвы: с 1 рисуем, когда нарисовали, показываем её и начинаем рисовать во 2, когда в ней нарисовали — показываем и рисуем в 1 и т.д.
                                                                    2) синусы/косинусы заранее загоняем в массив, памяти скучаем немного, но пересчет будет быстрее
                                                                    3) правильнее полигоном брать 3хугольник, но в частных случаях этим можно пренебречь
                                                                    4) каждый полигон должен быть виден только с одной стороны, поэтому надо смотреть куда он повернут (т.е. например некоторые грани куба мы явно не увидим, так как они повернуты от нас и нет смысла тратиться на их отрисовку) и не выводить те, которые не видны
                                                                    5) разобраться что такое матричные преобразования, так как большинство статей в инете на них опирается (у меня они стерлись из мозга сразу после сдачи соответствующих экзаменов)
                                                                    6) не спрашивайте меня про текстурирование, свет, тени и т.д. — это в разы сложнее чем вывести 4х уголник + делать это софтверно на данном этапе развития всяких API (directx, opengl) имхо глупо (опять же если не стоит какой то специфичной задачи)
                                                                      0
                                                                      Простите, а зачем среднее арифметическое?
                                                                        +1
                                                                        чтобы узнать где находиться центр глубины (Z) 4хугольника, чтоб потом по этой глубине сортировать (если писать правильно, то надо 3х угольник брать конечно же)
                                                                          0
                                                                          Понял, спасибо
                                                                        0
                                                                        Еще, кстати, есть ряд вопросов:
                                                                        1) для каких углов необходимы значения синуса и косинуса? Для всех в пределах 360 градусов с каким-то определенным шагом?
                                                                        2) Как «посмотреть», куда повернут полигон? Есть ли какой-то универсальный метод?
                                                                          0
                                                                          1) для всех 360* с нужным шагом (+1 или +0.5)
                                                                          2) лучше в гугле поищите или почитайте статейки на том же gamedev
                                                                          а вообще смотря что надо… может быть лучше изучить opengl? а не писать свой software рендер?
                                                                            0
                                                                            Давайте погуглю, просто хотелось бы узнать, каким методом пользовались вы.
                                                                            OpenGL, конечно, крут, но и он базируется на каких-то принципах, которые нужно изучить вначале :)
                                                                              0
                                                                              у меня програмный рендеринг, так как для php другого варианта не видел 4-5 лет назад, для js еще не было webgl, а с флешем связываться не хотелось… просто я же незнаю что и где нужно вам, к примеру если есть цель написать на сях/делфи/etc под винду, то нет смысла загоняться с кучей формул/матриц (если только это не ради развлечения), если API всё это дает уже в готовом виде
                                                                                0
                                                                                Я понимаю, что у вас программный рендеринг. Задача стоит осознать, как все происходит не на уровне API, а под ним, just4fun :) Поэтому мой вопрос просто в том, чтобы вы рассказали об используемых вами методах, да и комментарий мой с просьбой о статье кто-то да плюсанул, видимо, людям все же интересно. Как-то так.
                                                                                  0
                                                                                  ну я рассказал об основном, всякие преобразования можно найти, загуглив например «вращение вокруг произвольной оси в пространстве»…
                                                                                  посмотрите algolist.manual.ru/graphics/3dfaq/index.php — кажется это именно то что надо, там и про проекцию на экран и про z-буфер и про вращения/повороты и т.д.
                                                                                  + на на том же gamedev есть несколько хороших статей про рендеринг, вращения, физику и т.д. (т.е. которые не опираются на API, а голая математика)
                                                                                    0
                                                                                    более полный вариант формулки для отображения 3д на плоскости (на мониторе)
                                                                                    sx = xSize/2+x*dist/(z+dist),
                                                                                    sy = ySize/2-y*dist/(z+dist).

                                                                                    xSize, ySize — размер экрана, x,y,z — точки которые рисуем, dist — дальность от камеры до сцены (точнее до начала координат), sx,sy — уже то что надо отрисовать
                                                                +1
                                                                Все, что я делал когда-то just4fun, пригодилось мне по работе.
                                                                  –6
                                                                  Какое говно на хабре, а.

                                                                  Любой подрастающий программист (не среднестатистический идиот, которого родаки отправили учиться на быдлокодера), а обычный такой хороший студентик пишет каждый день подобную прогу, и показывать ее, как правило стыдится, потому что это все хеловорлды, подобные онанизму, которым занимайся, но не мозоль людям глаза, никому не интересно.

                                                                  Но так я думал раньше. Так я думал всегда. Так было всегда в моем окружении. Это было обычное становление программистской молодежи. Но блин! Что я вижу теперь? На Хабре – на сайте, претендующем называться ведущим IT-шным блогом, со строгими правилами оформления постов и даже модерацией – я вижу этот высер! Которого у каждого быдлокодера как макулатуры в сарае, выше крыши.
                                                                  И этот пост еще каким-то образом попадает в «Рекомендуемые записи» моего Гугл Ридера? Т.е. людям нравится читать это со страниц Хабра?

                                                                  Хабр, твою мать, тебя одолела школота, засирает тебя как какую-то жж-шэчку. То сортировка пузырьком, то получасовой опыт написания «мегакрутой программы, которая читает инфу с фейсбука», то вообще нечто такое тупое, что я бы даже в жж свой не запостил, если б вел.

                                                                  Хабр. Мне тебя жаль.
                                                                    +1
                                                                    один пипл пишет, другой пипл хавает — ничего не поделаешь =) надо делать свой хабр, с коллайдерами и профессорами
                                                                      +1
                                                                      Какие мы нежные…
                                                                        +2
                                                                        Вы такой крутой, у меня даже на секунду дыхание перехватило. Поделитесь своими разработками, которые не стыдно показать и которые, по вашему мнению, достойны были бы быть на хабре.
                                                                          0
                                                                          на сайте, претендующем называться ведущим IT-шным блогом

                                                                          Претендующем? Раньше, может, такое и было. Сейчас это коллективный блог компаний и жалоб на очередной нехороший сервис. Хорошо, что сюда еще пишут какие-то статьи, напрямую связанные с IT.
                                                                            +2
                                                                            Пост опубликован в блоге «Кодобред» и не выдаётся за откровения гуру. Какие могут быть вопросы?
                                                                              0
                                                                              0 статей — лучшее подтверждение своей скромности, надо полагать…
                                                                                0
                                                                                Незнание элементарных правил хабра – таких как зависимость кармы от возможности публиковать статьи – лучшее подтверждение тупости среднестатистической хаброшколоты, надо полагать…
                                                                                  0
                                                                                  Какой забавный…
                                                                                  Ну неужели такой выдающийся ум не мог нигде опубликовать результаты своей деятельности? Я бы с превеликим удовольствием почитал Ваши статьи.
                                                                                  P.S.: великим умам грамотность чужда — она лишь для тех, у кого свободного места в голове в избытке, надо полагать.
                                                                                    –1
                                                                                    А кто ты такой, чтобы я с тобой делился чем-то полезным или интересным? Один из тысяч бездарных хомячков, заполонивших хабр?
                                                                                    Нет уж, я своими открытиями и знаниями делюсь с теми, кто этого заслуживает – с теми, кто имеет потенциал, или от кого самому интересно что-то узнать. И с ними самым интересным делюсь лично, а не публикую это, дроча на статистику или карму. А от вас только однострочные, превращающие хабр в помойку, подъебки. За это я вам должен какие-то ссылки давать?
                                                                                    Вот когда достаточно повзрослеешь, чтобы думать прежде, чем писать (да, чтобы не писать зря, например, вон тот однострочный коммент), чтобы хоть кому-то было интересно тебя прочесть, тогда очеловеченный и возвращайся ко мне с вопросами, смененными с вида «а дайте что-нить почитать, дайте читать! дайте хавать! а я тут просто погажу на вас в комментах, а вы давайте пишите мне статьи!» на что-нибудь более толковое и вызывающее у меня хоть какой-то интерес к тому, чтобы чем-то поделиться.
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                              • НЛО прилетело и опубликовало эту надпись здесь

                                                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                Самое читаемое