forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Странное. (http://forum.boolean.name/showthread.php?t=15405)

dsd 23.10.2011 15:58

Ответ: Странное.
 
Ну ради такого дела завел таки аську: 615638833.
Почему нельзя на форум выложить? Такие тайные технологий что за ними пентагон охотится?

dsd 23.10.2011 17:45

Ответ: Странное.
 

Кажется я сделал велосипед :-D


Придумал генерацию лайтмапов на основе хейгтмапы.

1. Узнаем с какой стороны солнце.
2. Создаем массив из интегер с разрешением в 4 раза больше того массива в котором хранятся данные высот вершин. у меня это (8х32)х(8х32).
3. Узнаем направление источника света в виде 2д вектора. Строим еще один массив с разрешением равным количеству вершин. Далее смещаясь от угла куда первыми приходят лучи от света проверяем затенит ли вершина соседнюю (минимальный перепад высот который будет затенен вычисляется легко, т.к. дельтаикс и дельтаигрек между вершинами постоянны. Заполняем массив значениями. На свету эта вершина или нет.
4. Для мест где соседствуют затененные с освещенными вершины строим более подробные кусочки лайтмапы 4х4.
5. Учусь писать изображение не врайтпикселями, а сразу числами в жопег или бмп.
6. Немного извращений в пиксельном шейдере. И будет быстрая лайтмапа за время исполнения на цпу ~ 1 мс или меньше. :)

Mr_F_ 23.10.2011 18:46

Ответ: Странное.
 
делал нечто подобное, только шейдером, имея карту высот на видюхе и рендеря лайтмап за несколько кадров кусками. шейдер выглдяит вот так:
Код:

        float2 TexCoords = IN.ScreenTC / MapSize;
        float h = tex2D(heighttex,TexCoords).r;
        float height = h * heightMult;
        float3 pos = float3(TexCoords.x,height,TexCoords.y);

        float3 end = saturate(pos - LightDir*(1.0f/MapSize)*128);

        float3 step = (end - pos)/128.0f;


        float p = 0;

        for(int i=0;i<128;i++)
        {
                pos += step;

                p = tex2D(heighttex,pos.xz).r * heightMult;
                if (pos.y < p) return float4(0,1-(step.y*i)/heightMult,0,1);  //0;// Intersection!//
        }

        return 1;// (no intersections)

суть в том что от каждого обрабатываемого пикселя ведётся луч в направлении солнца, и если за требуемое кол-во итераций, луч врезается в хейтмап, значит пиксель затенён.

Reizel 23.10.2011 18:58

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 206685)
Почему нельзя на форум выложить? Такие тайные технологий что за ними пентагон охотится?

Можно, даже нужно, и даже выложу, но я смотрю, что у тебя здорово получается делать генератор, потому имею желание общаться не только на форуме)

dsd 24.10.2011 05:13

Не, там такой говнокод что переделывать уже хочется.

Надо делать отдельно генерацию данных как у меня, здесь мне все еще кажется вполне приличной созданная конструкция. А вот часть где происходит позиционирование вершин надо бы вынести в отдельный класс, где объектом будет вершина и несколько методов её перемещения и контроля. Вообще надо заморочится системой квадов. Ввести какой-нить менеджер квадов запоминающий какой индекс соответствует четырем вершинам с двумя треугольниками и в какой поверхности они есть. Т.к. квадов из одной поверхности все-таки не хватит, а сотня поверхностей как у меня делает узким местом видеокарту.

Решил сочинять класс вода. Имея в виду перегрузку операторов и используя наследование и виртуальные функции. Это будет эпичная хрень на девиантных методах программирования :)

Код:

//  вектор в тридэ
class float3 {
    public:
    float x;
    float y;
    float z;
};
//вершина
class vert_data {
    public:
    int index;
    float3 position;
    float3 normal;
    /*
    обновление нормали.
    есть четыре вектора (1,0,val00-val10) (0,1,val00-val01) (-1,0,val00-(val-10)) (0,1,val00-(val0-1))
    попарно векторное умножение даст четыре нормали сумма/4 результирующая нормаль.
    одно вычисление валидно для четырех квадов
    */
};
//квад
class quad {
    public:
    Handle *surf;
    vert_data v00;
    vert_data v01;
    vert_data v10;
    vert_data v11;
    int index;
};

//менеджер квадов
class manager {
    public:
    //массив под поверхности
    Handle *surf;
    // массив квадов
    quad ****sys;
    //размер элемента группы квадов.
    int size;
};

class water {
    public:
    manager sea;
    manager river;
    manager lake;
};

Вот такой мне представляется структура... эмм... комплекса классов для разных типов воды.

Цитата:

Сообщение от impersonalis (Сообщение 206528)
неужели есть люди, которые думают, что изучат ЯП, прочитав учебник? Разумеется, надо развиваться и самостоятельно. Однако, благодаря квази-студентам, которые не в состоянии написать диплом, девальвация образования и поддерживается. У меня много примеров студентов, которые работали (в т.ч. и по специальности) и учились (без кавычек). ЧЯДНТ?
Честно говоря, теперь, узнав что автор уже человек с высшим образованием, технарь, не может осилить относительно простую теорию (в которой сам заинтересован - а такая мотивация сдвигает горы), я испытываю батхёрт мне приходит в голову анекдот (изначально он был с полит.подтекстом, но не нашёл оригинала).
http://www.detskie-anekdoty.ru/detsk...po lgoda.html
dsd, умерьте спесь: если б вы были семи пядей во лбу и действительно ценили своё время - вы бы бросили учёбу курсе на первом-втором. А так - гордится тут абсолютно нечем.
Прошу извинить, если обидел. Это сугубо моё мнение. Практика показала, что, разумеется, есть и другие стратегии поведения, но они сопровождаются и другими решениями (типа того, что я привёл: бывает да - ВУЗ не тот выбрал, со специальностью ошибся, недооценил свой интеллект). Думаю, нам всё же пора вернуться к теме обсуждений, а не доказывать друг другу свою крутость.

Наверно в Москве строителей готовят в технических вузах. Я учился в технологическом. Математика там преподавалась одну пару в неделю первые два курса, с одним практическим занятием раз в две недели. А всякие сопроматы к математике имеют такое же отношение как и хоровое пение. На технических специальностях помоему дают больше математики за один первый месяц, причем в том числе по часам :-). Так что у строителей дело с математикой обстоит может и лучше чем у бухов но едва-едва.

Придумал прикольную защиту от кряканья триальных версий. Делается обычный таймер по которому приложение вырубается.

создается второй таймер, который сработает через время: таймер1+RND(10,240);

Создаем меш, парентим его к камере, создаем поверхность 30-40 тыщ квадов перед камерой, так чтобы они перекрывали обзор, а координаты у вершин образовывающих квад совпадали. Ставим этому мешу xEntityAlpha mesh,0.01. xHideEntity mesh
если таймер2 дотикал до своего времени xShowEntity mesh.
Fatality.
Драйвер видюхи в панике. И даже если после восстановления все ок, это ттттттттрмооооооозззззззззиииииииитттттт адски, а почему не понятно и не видно :)

Какие-то проблемы, ок вышлите нам екзешник, ага значит проблемы нет?

Цитата:

Your use of this software is subject to the terms of the
agreement located at http://go.microsoft.com/fwlink/?link...08&clcid=0x409.

If you do not agree to these terms, you may not use the software.
Это типа можно использовать даже если я не согласен с условиями их лицензии?

moka 24.10.2011 20:53

Ответ: Странное.
 
Использование данного софта Вами, покрывается условиями соглашения, по ссылке: ...

Если вы не согласны с условиями соглашения, вы не должны использовать данный софт.

dsd 25.10.2011 00:27

Ответ: Странное.
 

Маленькое вуду со снегом и чем-то вроде контрастности зависящей от текстуры.

Код:

float4 color=diffuse * lit * lightColor+diffuse*ambient;
color=1.1*pow(color,1.7);
if(input.position2>=75.0f) {color=1.1*pow(color,4);}
return color;}

Можно забацать очень психоделический шейдер если еще и кубамапу как-нибудь не адекватно использовать и блики от отраженного света.

impersonalis 25.10.2011 00:32

Ответ: Странное.
 
выглядит круто

Reizel 25.10.2011 03:16

Ответ: Странное.
 
Дерево

Суть в чем: есть главная рекурсивная функция BuildTree, принимающая параметром небольшую структурку:
Код:

struct Trunc{
        float x,y,z;                //Координаты
        float nx,ny,nz;            //Нормаль епта)
        float fSectionSize;        //Размер одной секции (длина)
        float fSectionRadius;      //Радиус секции, стартовый         
        float fSectionFinishRadius; //КОгда кончать строить хуйту

        int iMesh,iSurface;        //Геометрия, сурфейс
        int iVertexCount;          //Точность
        int iSectionCount;          //Количество секций, блеать
        int iLeafSurface;          //Сурфейс листвы
    };

По нему она строит циклично ствол + искривляет его чуть чуть, и в каждом стыке запускает еще пару-тройку рекурсивных стволов (чуть -чуть изменяя структуру входную)


dsd 25.10.2011 11:00

Ответ: Странное.
 


Код:

Function BuildTree()
gh=xLoadMesh("mesh/tree.b3d")
xEntityTexture gh,treetex
base=xCopyEntity (gh)
xScaleEntity base,2,1,2

MakeItCone(gh)



ph=xCreateCube()
xPositionMesh ph,0,1,0
xEntityAlpha ph,0.1
CreateChilds(ph,1,1)



For d=0 To xCountChildren(ph)-1
        child=xGetChild(ph,d)
        CreateChilds(child,0.6,0.5)
Next


For d=0 To xCountChildren(ph)-1
        child=xGetChild(ph,d)
                For z=0 To xCountChildren(child)-1
                        childl2=xGetChild(child,z)
                        CreateChilds(childl2,0.8,0.25)
                Next
Next

For d=0 To xCountChildren(ph)-1
        child=xGetChild(ph,d)
                For z=0 To xCountChildren(child)-1
                        childl2=xGetChild(child,z)
                                For x=0 To xCountChildren(childl2)-1
                                        childl3=xGetChild(childl2,x)
                                                CreateChilds(childl3,1.2,0.125)
                                Next
                Next
Next
End Function

Function CreateChilds(child,zscale#,level#)
qbranches=Rand(1,4)
sdegree=Rand(0,359)
For i=0 To qbranches

pc=xCopyEntity(gh,child)
xPositionEntity pc,0,xMeshHeight(child)-0.01,0
xScaleEntity pc,level,zscale+Rnd(-0.1,0.1),level
xRotateEntity pc,40+Rnd(-15,15),sdegree+i*(360/(qbranches+1))+Rnd(-25,25),0
Next
End Function

Но это глупо все-таки. По-моему надо замутить покореженный ствол с минимумом толстых корявых веток. На конце каждой ветки сделать типа моих камней только с низкой детализацией, и натыкать рандомно штук 10-20 двухсторонних квадов для имитации отдельных мелких веток. И все одной поверхностью. Ствол можно думать из сетки деформированной шумом перлина и свернутой в цилиндр, которую еще несколькими синусами вдоль игрека изогнуть и в переменно от высоты отскэйлить. То же и для веток. Должно получиться дешево и сердито.

У тебя кстати получилось похоже на алгоритм в котором есть несколько точек куда ветки должны более охотно расти.

Reizel 25.10.2011 14:09

Ответ: Странное.
 
Твое дерево круче смотрится, но оно состоит из готовой модели??
мое делается с нуля, вот код

а насчет рандомного ствола - проще сделать окружность, слегка помятую:


и по ней строить ствол.

dsd 25.10.2011 14:43

Ответ: Странное.
 
Нет. Там 12 полигонов свернутых в трубочку и раставленными в тридэмаксе тектсурными координатами. Раньше для меня было проблемой сгенерировать такой меш. А деревья одинаковые. У твоего со ствлом все гуд, лучше чем у меня, но вот листья приклеены неправильно. Их надо клейть ближе к концам веток, на толстых частях ветвей у нормального дерева листьев нет, если это не тополь. И если ты присмотришься к самим листьям у нормального дерева, то увидешь, что листья у них примерно одного размера и нормали поверхности ВСЕХ листьев смотрят в одном направлении, на источник освещения. Впринципе последний левел ветвей должен быть плоским и стараться лежать в плоскости примерно паралельной плоскости с нормалью (0,1,0) плюс минус 15 градусов. Вот такие у меня дополнеия к эль сустем.

кстати можно не заморачиваться со слиянием всех элементов дерева в одну поверхность я уже практически дописал менеджер квадов, который можно будет легко превратить в менеджер трианглов каковым и обернуть все полигоны сингосюрфицируемого дерева. А потом провести слияние вершин с одинаковыми нормалями позициями и текстурными координатами. Единственно надо пытаться уложиться по полигонам в ~15к .

Reizel 25.10.2011 16:14

Ответ: Странное.
 
Вот с листвой то у меня и были основные проблемы))
Не знал как их клеить. Да и тормозное оно какое-то, из за тексы с альфаканалом ФПС падает в 2 раза. Провал :(

dsd 25.10.2011 16:49

Ответ: Странное.
 
. Ну вот поэтому я и хочу основную часть листвы имитировать несколькими мятыми облачками.
Кстати твоему дереву не от чего тормозить, разве что ты каждый листик сделал отдельным сюрфейсом, тогда да. Мое не тормозило на встроеном intel gma 945. При этом еще и листики все поварачивались к камере на каждый кадр.

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

Reizel 25.10.2011 17:24

Ответ: Странное.
 
Листья синглсюрфейс
Код:

struct Trunc{
        float x,y,z;                //Координаты
        float nx,ny,nz;            //Нормаль епта)
        float fSectionSize;        //Размер одной секции (длина)
        float fSectionRadius;      //Радиус секции, стартовый            :    size
        float fSectionFinishRadius; //КОгда кончать строить хуйту

        int iMesh,iSurface;        //Геометрия, сурфейс
        int iVertexCount;          //Точность
        int iSectionCount;          //Количество секций, блеать
      int iLeafSurface;          //Сурфейс листвы
    };

ПС может я не так понимаю значение термина "синглсюрфейс" ?


Часовой пояс GMT +4, время: 22:30.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot