Тема: Странное.
Показать сообщение отдельно
Старый 31.10.2011, 02:44   #202
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

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

class tree{
/*
Вот у меня есть этот объект.
Что он должен знать?
Он должен суметь вычислить количество и позицию своих детей, угол поворота и масштаб для каждого ребенка.Знать родителя не должен.
*/
public:
static newgeom branch_mesh;
tree** child;
int number;
float3 pos;
float3 rot;
float3 scale;

//количество детей
int ch_num;
//constructor
tree(float3 p,float3 r,float3 s){
    pos=p;
    rot=r;
    scale=s;
    //это оно узнало, где оно и как в пространстве живет.
    //теперь оно узнает где конец. Сейчас неюгеом настроен на меш длиной 32 юнита
    float length=32;
    //вычислю координаты конца this ветки
    //для этого скопирую меш из меша
    Handle mesh=xCopyMesh(branch_mesh.mesh);
    xPositionEntity(mesh,pos.x,pos.y,pos.z);
    xRotateEntity(mesh,rot.x,rot.y,rot.z);
    xScaleEntity(mesh,scale.x,scale.y,scale.z);
    xTFormPoint(0,length,0,mesh,0);
    //безо всякой математики получилась нужная точка. Хвала разрабам.
    float3 ch_pos(xTFormedX(),xTFormedY(),xTFormedZ());

    //Пусть определится с количеством детей
    ch_num=xRand(2,4);
    //создам данные для детей это будет матрица флоат3 шириной в количество детей высотой в три
    //первая строка позиция,вторая угол, третья масштаб.
    float3 data[3][ch_num];
    //заполню строку позиции
    for(int i=0;i<ch_num;i++){data[0][i]=ch_pos;}
    //теперь надо определиться с поворотом.
    //очевидноБ что первое число отворот от оси родителя, а второе вращение
    //пусть веточки растут через примерно равное кол-во градусов.
    for(int i=0;i<ch_num;i++){data[1][i]=rot+float3(30.0+xRnd(-15,15),360.0*i/ch_num+xRnd(-15,15),0);}
    //пусть считает итоговый скейл детенышей
    for(int i=0;i<ch_num;i++){data[2][i]= scale*float3(0.5,0.5,0.5);}
    //создание детей
    child=new tree*[ch_num];
    for(int i=0;i<ch_num;i++){child[i]=new tree(data[0][i],data[2][i],data[3][i]);}
...
}
В принципе ничто не мешает добавить то-же самое по длине ветви с рандомным смешением вдоль её тела. Но это плохой вариант, на один ствол уйдет не одна сотня тыщь полигонов при хоть какой-то детализации и это не считая листвы. Тут долго думать надо, быстрей было б накидать и раскрасить их в тридэмаксе.
(Offline)
 
Ответить с цитированием