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 01.09.2011 21:47

Странное.
 
PHP код:

void AnimateMeshok(double vertsize){
    
double ent_scale=xEntityScaleX(picked_entity);
double scale=vertsize*xEntityDistance(Camera,picked_entity)/ent_scale;
Handle parent=picked_entity;
Handle parent_surf=picked_surface;//xPickedSurface();
Handle surf=xGetSurface(Vertexso,0);

xTFormPoint(xEntityX(Camera,1),xEntityY(Camera,1),xEntityZ(Camera,1),0,picked_entity);
// позиция камеры в координатах меша
int camX=xTFormedX();
int camY=xTFormedY();
int camZ=xTFormedZ();
      
// считаю количество точек в меше
int qvert=xCountVertices(parent_surf);

    
int i;
    for(
i=0;i<qvert;i++) {
    
double x,y,z;
    
//базовые координаты смещаю по нормали точки.
        
x=xVertexX(parent_surf,i)+0.02*xVertexNX(parent_surf,i);
        
y=xVertexY(parent_surf,i)+0.02*xVertexNY(parent_surf,i);
        
z=xVertexZ(parent_surf,i)+0.02*xVertexZ(parent_surf,i);
// вектор точка-камера
        
double wcx,wcy,wcz;
            
wcx=x-camX;
            
wcy=y-camY;
            
wcz=z-camZ;
        
// найду любой перпендикуляр x1*x2+y1*y2+z1*z2=0
        // x1*(y1*z1)+y1(-0.5*x1*z1)+z1(-0.5*x1*y1)=0
            
double vx=wcy*wcz;
            
double vy=-0.5*wcx*wcz;
            
double vz=-0.5*wcx*wcy;
            
double length=sqrt(vx*vx+vy*vy+vz*vz)/scale;
            
// нормализация вектора
            
if(length>0) {vx=vx/lengthvy=vy/length;vz=vz/length;}
            
//теперь векторным произведением найду третий перпендикуляр
            
double vvx=wcy*vz-vy*wcz;
            
double vvy=wcz*vx-vz*wcx;
            
double vvz=wcx*vy-vx*wcy;
            
//нормализация вектора
            
length=sqrt(vvx*vvx+vvy*vvy+vvz*vvz)/scale;
            
// нормализация вектора
            
if(length>0) {vvx=vvx/lengthvvy=vvy/length;vvz=vvz/length;}
            
//смещение базовой точки на половинки векторов
            
x=x-0.5*(vvx+vx); y=y-0.5*(vvy+vy); z=z-0.5*(vvz+vz);
    
// этап последний нужно выставить текущие четыре вершины меша на новые позиции.
    
xVertexCoords(surf,4*i,x,y,z);
    
xVertexCoords(surf,4*i+1,(x+vx),(y+vy),(z+vz));
    
xVertexCoords(surf,4*i+2,(x+vvx),(y+vvy),(z+vvz));
    
xVertexCoords(surf,4*i+3,(x+vvx+vx),(y+vvy+vy),(z+vvz+vz));
    
//yeah
    
}


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

Есть волшебный флаг или надо переписывать?
Меш создается так:
PHP код:

Handle CreateVertexMeshok( ){
        
Handle Surf=xPickedSurface();
        
// считаю количество точек в мешке.
            
int Qvert=xCountVertices(Surf);
        
//создаю меш

        
Vertexso=xCreateMesh(picked_entity);

        
Handle mSurf=xCreateSurface(Vertexso);
    
int i;

    for(
i=0;i<Qvert;i++) {
    
double x,y,z;
        
x=xVertexX(Surf,i);
        
y=xVertexY(Surf,i);
        
z=xVertexZ(Surf,i);
        
int v0,v1,v2,v3;
        
v0=xAddVertex(mSurf,x,y,z,0,0);
        
v1=xAddVertex(mSurf,(x+0.06),y,z,0,1);
        
v2=xAddVertex(mSurf,x,(y+0.06),z,1,0);
        
v3=xAddVertex(mSurf,(x+0.06),(y+0.06),z,1,1);
        
xVertexColor(mSurf,v0,0,0,255);
        
xVertexColor(mSurf,v1,0,0,255);
        
xVertexColor(mSurf,v2,0,0,255);
        
xVertexColor(mSurf,v3,0,0,255);
            
xAddTriangle(mSurf,v1,v0,v2);
            
xAddTriangle(mSurf,v1,v2,v3);
                }
    
xEntityFX(Vertexso,FX_VERTEXCOLOR+FX_FULLBRIGHT);
return 
Vertexso;


Правильно:

Неправильно:


Было бы наоборот я бы не удивился.

pozitiffcat 01.09.2011 22:44

Ответ: Странное.
 
хер знает че ты там делаешь, не стал разбираться, но обычно можно ошибиться в одной вещи это например xPositionEntity он имеет в параметрах модель xyz и ещё важная деталь - использовать глобальные позиции или нет (false true), это есть во всех командах относящихся к трансформации.
ЗЫ. получи xyz глобальные всего объекта и рисуй вертексы vertexX + modelX и т.п. чтоб они правильно рисовались
Это если я правильно понял что ты делаешь )))

dsd 01.09.2011 22:58

Ответ: Странное.
 
Ты мне еще справку по блитз3д почитать предложи.

Лучше б "первый нах" написал бы, чесслово.

pozitiffcat 01.09.2011 23:15

Ответ: Странное.
 
Ну а чеж ты тогда запутался с позициями объектов?

dsd 01.09.2011 23:25

Ответ: Странное.
 
Скачай, запусти и потом скажи куда твои "позиции" относятся.

А если внятно объяснишь почему это лечится xTurnEntity(picked_entity,360,0,0); в соответствующем месте, то я паду ниц и протру челом ковер, насквозь, пля.

dsd 03.09.2011 22:27

Ответ: Странное.
 
У меня сложилось впечатление, что в хорсе в поверхности не может быть вершин более, чем 81 204 или около того. Это так?

.Squid 03.09.2011 23:09

Ответ: Странное.
 
http://area.xors3d.com/forums/viewto...7&p=3801#p3801

dsd 03.09.2011 23:15

Ответ: Странное.
 
у меня рисует поверхность с таким кол-вом точек.

На форуме на сайте только на английском языке писать можно?

.Squid 03.09.2011 23:30

Ответ: Странное.
 
Желательно.

dsd 04.09.2011 03:09

Ответ: Странное.
 
Сочинил нечетко чоткий пик отрезка.



void Draw_Control_Tool(double size){
//нахождение центра выделенных точек.
Vector center=Center_Positioner();
double xc,yc,zc;
xc=center.x;
yc=center.y;
zc=center.z;
double xCam=xEntityX(Camera,1);
double yCam=xEntityY(Camera,1);
double zCam=xEntityZ(Camera,1);
double dist=sqrt((xc-xCam)*(xc-xCam)+(yc-yCam)*(yc-yCam)+(zc-zCam)*(zc-zCam));
size=0.04*dist*size;
//базовая точка
xCameraProject(Camera,xc,yc,zc);
int x0=xProjectedX();
int y0=xProjectedY();

//ось икс
xCameraProject(Camera,xc+size,yc,zc);
int xOx=xProjectedX();
int yOx=xProjectedY();
xColor(255,0,0);
xLine(x0,y0,xOx,yOx);
//ось игрек
xCameraProject(Camera,xc,yc+size,zc);
int xOy=xProjectedX();
int yOy=xProjectedY();
xColor(0,255,0);
xLine(x0,y0,xOy,yOy);
//ось зед
xCameraProject(Camera,xc,yc,zc+size);
int xOz=xProjectedX();
int yOz=xProjectedY();
xColor(0,0,255);
xLine(x0,y0,xOz,yOz);

int mouseX=xMouseX();
int mouseY=xMouseY();
xColor(127,127,127);
xLine(x0,y0,mouseX,mouseY);
// пугающий меня код анализирующий возможное взаимодествие мыши и объекта
// определение совпадения одной из рисуемых осей с позицией мыши.
bool pOx=0;
bool pOy=0;
bool pOz=0;
/* у меня есть две точки для каждой из прямой, значит я могу проверить принадлежит ли третья точка любой из этих прямых.
условие что три точки лежат на одной прямой (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)=0
также пусть в радиусе 5 пикселей от точки центра столкновение не учитывается и после конца стрелки
не учитывается также
*/

// проверка принадлежности точки мыши отрезку

double cccx=(xOx-x0)*(mouseY-y0)-(mouseX-x0)*(yOx-y0);
double cccy=(xOy-x0)*(mouseY-y0)-(mouseX-x0)*(yOy-y0);
double cccz=(xOz-x0)*(mouseY-y0)-(mouseX-x0)*(yOz-y0);

double range=1000;
double lll=sqrt((x0-mouseX)*(x0-mouseX)+(y0-mouseY)*(y0-mouseY));
if (cccx<=range && cccx>=-range && ((xOx-x0)*(mouseX-x0))>0 && ((yOx-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double llx=sqrt((x0-xOx)*(x0-xOx)+(y0-yOx)*(y0-yOx));
if(lll>5 && lll<=llx) {/*если пересеклось то*/ pOx=1;}}

if (cccy<=range && cccy>=-range && ((xOy-x0)*(mouseX-x0))>0 && ((yOy-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double lly=sqrt((x0-xOy)*(x0-xOy)+(y0-yOy)*(y0-yOy));
if(lll>5 && lll<=lly) {/*если пересеклось то*/ pOy=1;}}

if (cccz<=range && cccz>=-range && ((xOz-x0)*(mouseX-x0))>0 && ((yOz-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double llz=sqrt((x0-xOz)*(x0-xOz)+(y0-yOz)*(y0-yOz));
if(lll>5 && lll<=llz) {/*если пересеклось то*/ pOz=1;}}


xColor(255,0,0);
char console[256];
if (pOx) {
sprintf(console, "Ox is picked");
xText (100, 230, console);
}
if (pOy) {
sprintf(console, "Oy is picked");
xText (100, 240, console);
}
if (pOz) {
sprintf(console, "Oz is picked");
xText (100, 250, console);
}
xColor(255,255,255);

}

dsd 04.09.2011 21:22

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

Научил "это" неадекватно и коряво шевелить точками модели.
Помоему в средние века сжигали за меньшую ересь :-D
[q] сборсить поверхность.

dsd 07.09.2011 02:17

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

void xSeedRnd(int seed){
srand(seed);
}

double xRnd(double min, double max){
    double length=max-min;
    double var =((double) rand() / (double)RAND_MAX);
    double value=min+var*length;
return value;
}

int xRand(int min, int max){
    int length=max-min;
    double var =((double) rand() / (double)RAND_MAX);
    int value=min+var*length;
return value;
}

double xMod(double a,double b){
double c=a-b*floor(a/b);
return c;
}
double xAbs(double value){
if (value<0) {value=-value;}
return value;
}

Этих функций мне не хватало :)

moka 07.09.2011 02:20

Ответ: Странное.
 
Почему у тебя xRnd а вторая xRand (разве там нету перегрузки функций).
Синтаксис пляшет, выглядит ужасно, будто сплошной копи-паст.

dsd 07.09.2011 02:21

Ответ: Странное.
 
Одно с дробной частью второе целые, як в блитце.

moka 07.09.2011 13:04

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

Сообщение от dsd (Сообщение 201535)
Одно с дробной частью второе целые, як в блитце.

Blitz3D - плохой пример, того как нужно кодить и т.п. Ты не на бэйсике уже, избавляйся от подобных "привычек", они будут конкретно мешать в будущем..

impersonalis 07.09.2011 13:42

Ответ: Странное.
 
abs fabs в C какбе намекаэ

.Squid 07.09.2011 15:48

Ответ: Странное.
 
Топик называется "Странное". Так что все ок.

dsd 07.09.2011 21:33

Ответ: Странное.
 
Подскажите команду наподобие printf();только чтобы можно было печатать double.

.Squid 07.09.2011 21:53

Ответ: Странное.
 
Насколько я помню, %f подходит как для float, так и для double. В крайнем случае попробуй %Lf

dsd 08.09.2011 20:25

Ответ: Странное.
 
при наличии этой строки падает
double gh[512][512];
а при такой нет
double gh[256][256];
Почему О_о

UPD:
double *n[2048];
double bh[2048];
for(int i=0;i<2048;i++){n[i]=bh;}
n[2047][2047]=0.5;
printf("value %f",n[2047][2047]);
а так работает, че так?

moka 08.09.2011 21:28

Ответ: Странное.
 
Потому что максимальный размер массива 65536 (256x256), а ты пытаешься создать слишком большой? (догадка)

HolyDel 08.09.2011 21:41

Ответ: Странное.
 
double gh[512][512]; - превысил размер стека. создавай массив в куче
double *gh = new double[512*512];

.Squid 08.09.2011 22:44

Ответ: Странное.
 
Или в настройках линкера увеличить размер стека (по умолчанию в Студии он равен 1МБ)

Mr_F_ 09.09.2011 00:22

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

Или в настройках линкера увеличить размер стека (по умолчанию в Студии он равен 1МБ)
у меня рандомные стрёмнобаги начинали появляться, когда увеличивал. так что не рекомендую. никаких нет проблем создавать через new.

.Squid 09.09.2011 01:48

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

Сообщение от dsd (Сообщение 201685)
UPD:
double *n[2048];
double bh[2048];
for(int i=0;i<2048;i++){n[i]=bh;}
n[2047][2047]=0.5;
printf("value %f",n[2047][2047]);
а так работает, че так?

Тут ты вообще какую-то фигню делаешь.

dsd 09.09.2011 02:15

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

"Массивы указателей - конструкции интересные и весьма полезные" :-D
Основная фича, как говорится в моем мануале, это возможное разное кол-во элементов в каждой строке, вот.

.Squid 09.09.2011 02:37

Ответ: Странное.
 
Ну, если ты считаешь, что прав, то построчно объясни, что происходит.

dsd 09.09.2011 02:46

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


Или нужен именно мой пересказ?

.Squid 09.09.2011 02:53

Ответ: Странное.
 
Ну в книге то правильно, а у тебя нет.

dsd 09.09.2011 02:55

Ответ: Странное.
 
А почему работает тогда и не падает? О_о. Еще в книге написано, что имя массива это указатель на первую ячейку из него, так что вроде все окей должно быть.

SBJoker 09.09.2011 10:56

Ответ: Странное.
 
А оно невсегда упадёт, пока чужую память не попортишь.

dsd 09.09.2011 12:40

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

Сообщение от SBJoker (Сообщение 201760)
А оно невсегда упадёт, пока чужую память не попортишь.

это значит, что подобный указатель вернет мне адрес не той памяти, что была выделена под массив указатель на который я храню в ячейке исходного одномерного массива? Или что следить надо за тем, чтобы индексы были в пределах выделенной памяти?

Mr_F_ 09.09.2011 12:49

Ответ: Странное.
 
падать вроде и не должно. всем элементам массива указателей назначается адрес начала массива с даблами. соотв первый [2047] возьмёт указатель, второй сам дабл. правда смысла в массиве указателй на один и тот же адрес я не вижу.

Цитата:

при наличии этой строки падает
double gh[512][512];
делай так
double* gh = new double[512*512];

dsd 09.09.2011 12:59

Ответ: Странное.
 
А, понял на что мне гуру намекают :-) Что у меня во всех ячейках один и тот же массив и это попахивает кретинизмом хранить в одном массиве пару тысяч ссылок на один и тот же массив. Видимо для каждой ячейки нужно создавать уникальный массив и тогда все будет ок.

.Squid 09.09.2011 13:17

Ответ: Странное.
 
Да. Почитай про указатели еще раз.
ЗЫ. Ссылка != указатель, кстати.

dsd 10.09.2011 20:49

Ответ: Странное.
 
Продолжу нуб шоу по массивам:
double* gh = new double[512*512];
for(int i=0;i<512;i++) {
gh[0*i]=0.5*i;
}
for(int i=0;i<512;i++) {
printf(" value= %f",gh[0*i]);
}
печатает одно значение для всей строки, последнее. Я ожидал подряд идущих значений от 0 до 255,5.
упд. В нуле штолеО_о, это таки одномерный массив.

Идиотская конструкция печатает мне то что я хочу, где косяк в первой? ибо вторую печатать гораздо дольше:
//создаю массив
double *m0[size];
for(int i=0;i<size;i++){
m0[i]= new double[size];
}
//заполняю первую строку
for(int i=0;i<size;i++){
m0[0][i]=i;
}
//печатаю первую строку.
for(int i=0;i<size;i++){
printf(" index %f",m0[0][i]);
}

SBJoker 10.09.2011 21:58

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

dsd 10.09.2011 22:19

Ответ: Странное.
 
Я понял уже смысл такой записи массива :)

Написал глючный квадроалмазный генератор выдающий текстуру :)

Причем он получился раз в 50 резче блитцевского при равном объеме вычислений. Генерирует текстуру 4096х4096 за 5 сек вместе с рисованием её против нескольких минут. Не зря я все-таки полировал себе мозг цпэпом.

Dream 10.09.2011 22:50

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

Сообщение от dsd (Сообщение 201915)
глючный квадроалмазный генератор

Простите, ЧТО?!

dsd 10.09.2011 23:02

Ответ: Странное.
 
генератор карт высот по алгоритму diamond square

починил глюк, это был мусор в памяти :)
PHP код:

void xSeedRnd(int seed){
    
srand(seed);
}

double xRnd(double mindouble max){
    
double length=max-min;
    
double var =((double) rand() / (double)RAND_MAX);
    
double value=min+var*length;
return 
value;
}

int ARGB (int a,int r,int bint g){
int color=(a<<24)+(r<<16)+(b<<8)+g;
return 
color;
}

Handle Map_Generator(int sizedouble sharp){
xSeedRnd(xMillisecs());
//создается массив для значений

double *m0[size+1];
for(
int i=0;i<=size;i++){
    
m0[i]= new double[size];
}
for(
int i=0;i<=size;i++){
    for(
int j=0;j<=size;j++){
        
m0[i][j]=0;
        }
    }
//заполнение краев случайными числами (1;5)
m0[0][0]=xRnd(-5,5);
m0[size][0]=xRnd(-5,5);
m0[0][size]=xRnd(-5,5);
m0[size][size]=xRnd(-5,5);
//определяю степень size
int m=size;
int repetitions=0;
while(
m!=1){
repetitions++;
m=size>>repetitions;
}
repetitions--;

int step=size>>1;
while(
step>0){
    
//первая строка
    
for(int i=step;i<=size-step;i=i+step){
        for(
int j=step;j<=size-step;j=j+step){
         
//углы текущей ячейки
        
double val00=m0[i-step][j-step];
        
double val01=m0[i-step][j+step];
        
double val10=m0[i+step][j-step];
        
double val11=m0[i+step][j+step];
         
//крест генерируемых значений
        
if(m0[i][j]==&& val00!=&& val01!=&& val10!=&& val11!=0){m0[i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(
m0[i-step][j]==&& val00!=&& val01!=0){m0[i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i+step][j]==&& val10!=&& val11!=0){m0[i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i][j-step]==&& val00!=&& val10!=0){m0[i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i][j+step]==&& val01!=&& val11!=0){m0[i][j+step]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
        }
    }
step=step>>1;
}
//приведение значений в массиве в интервал (0;1)
double max=0;
double min=0;
for (
int i=0;i<=size;i++){
    for (
int j=0;j<=size;j++){
        if(
m0[i][j]>=max){max=m0 [i][j];}
        if(
m0[i][j]<=min){min=m0 [i][j];}
    }
}

double length=max-min;
for (
int i=0;i<=size;i++){
    for (
int j=0;j<=size;j++){
        
m0[i][j]=(m0 [i][j]-min)/length;
    }
}
//*************************************
//дальше вывод значений
Handle tex=xCreateTexture(size,size);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (
int i=0;i<size;i++){
    for (
int j=0;j<size;j++){
        
int color=255*m0 [i][j];
        
xWritePixelFast(i,j,ARGB(255,color,color,color),xTextureBuffer(tex));
    }
}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return 
tex;


на пробел сгенерировать новую карту.

.Squid 11.09.2011 01:23

Ответ: Странное.
 
Как вариант, можно еще писать array[i + n*j], где n - число столбцов. Просто в действительности данные расположены линейно, никаких двумерных (и тем более трех- и n-мерных) структур данных в памяти не может быть.
ЗЫ. Не писал бы этого, если бы не увидел [0*i] о_О

dsd 11.09.2011 14:41

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


Выкинул лишние проходы и научил это раскрашивать текстуру :) Теперь оно еще в 4 раза быстрей:)

void xSeedRnd(int seed){
srand(seed);
}

double xRnd(double min, double max){
double length=max-min;
double var =((double) rand() / (double)RAND_MAX);
double value=min+var*length;
return value;
}

int ARGB (int a,int r,int b, int g){
int color=(a<<24)+(r<<16)+(b<<8)+g;
return color;
}


Handle Map_Generator(int size, double sharp, int diff){

xSeedRnd(xMillisecs());
//создается массив для значений

double *m0[size+1];
for(int i=0;i<=size;i++){
m0[i]= new double[size];
}
for(int i=0;i<=size;i++){
for(int j=0;j<=size;j++){
m0[i][j]=0;
}
}
//заполнение краев случайными числами (1;5)
m0[0][0]=xRnd(-5,5);
m0[size][0]=xRnd(-5,5);
m0[0][size]=xRnd(-5,5);
m0[size][size]=xRnd(-5,5);

int step=size>>1;
while(step>0){
//первая строка
for(int i=step;i<=size-step;i=i+2*step){
for(int j=step;j<=size-step;j=j+2*step){

double val00=m0[i-step][j-step];
double val01=m0[i-step][j+step];
double val10=m0[i+step][j-step];
double val11=m0[i+step][j+step];

if(m0[i][j]==0 && val00!=0 && val01!=0 && val10!=0 && val11!=0){m0[i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
if(m0[i-step][j]==0 && val00!=0 && val01!=0){m0[i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i+step][j]==0 && val10!=0 && val11!=0){m0[i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i][j-step]==0 && val00!=0 && val10!=0){m0[i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i][j+step]==0 && val01!=0 && val11!=0){m0[i][j+step]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
}
}
step=step>>1;
}
//приведение значений в массиве в интервал (0;1)
double max=0;
double min=0;
for (int i=0;i<=size;i++){
for (int j=0;j<=size;j++){
if(m0[i][j]>=max){max=m0 [i][j];}
if(m0[i][j]<=min){min=m0 [i][j];}
}
}

double length=max-min;
for (int i=0;i<=size;i++){
for (int j=0;j<=size;j++){
m0[i][j]=pow(((m0 [i][j]-min)/length),diff);
}
}
//*************************************
//дальше вывод значений
Handle tex=xCreateTexture(size,size);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (int i=0;i<size;i++){
for (int j=0;j<size;j++){
double val=pow(m0 [i][j],2);
//уровень воды пусть будет 0,25. ТО есть чем ниже тем более синий цвет.
int red=0;
int green=0;
int blue=0;
if(val<=0.25) {blue=(1-val)*255; green=125*(1-val);red=0;} else {
if(val>=0.6) {red=255*val; green=120*val;blue=0;}
else{red=255*val; green=255*val;blue=0;}

}
xWritePixelFast(i,j,ARGB(255,red,green,blue),xText ureBuffer(tex));
}
}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return tex;
}

moka 11.09.2011 17:11

Ответ: Странное.
 
А шейдером можешь генерить подобное?

dsd 11.09.2011 19:19

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

dsd 14.09.2011 20:03

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

Для начала генерируется карта 4к х 4к, потом на основе девяти ячеек из карты генерится другая 128х128, с актуальным размером 112х112 и 16 кратным нахлестом с соседними тайлами, для избежания резких швов.
Вокруг игрока летает девять детализированных систем частиц и еще одна с шагом основной карты для изображения отдаленного пейзажа.

в одной системе частиц у меня получается уместить 20к квадов, 112х112=12544 верхушек кубиков и остается ~10к квадов для имитации стен вырытых канавок. Вроде достаточно. Всего уже получится 20х10=200 к полигонов на ландшафт. Потом для этого дела генерится мой любимый двумерный массив указателей в ячейках которого будут объекты несущие в своих полях маски для раскраски территории.

Ваши ставки, господа. Смогу ли я подобное сочинить? По ощущениям это должно быть впритык, но по силам :)

moka 15.09.2011 16:35

Ответ: Странное.
 
Извраты имхо.

Если делать достойную систему как в Minecrafte, то юзать динамичный Octree и генерировать ингл сюрфейс, разбитый на чанки исходя из Octree. Сами Octree чанки содержат вершинные и индексные индексы. При рендере нужные (видимые) чанки будут совмещатьс и рендериться всё большего размера чанками, 32х32х32 например.

dsd 15.09.2011 20:05

Ответ: Странное.
 
Господь с тобой Мока, не достойную, а отдаленно напоминающую.

moka 15.09.2011 23:03

Ответ: Странное.
 
Да хоть напоминающую. Достоинства в моём понимании, система которая будет достаточно шустра, и не будет ограничивать исходя из метода реализации. А это не просто.

Почему Octree, потому что это очень схоже с воксельными расчётами, каждый куб, есть по сути воксель. И используя Octree, это дело может быть весьма шустрым и динамичным.

Читай что-то на тематику SVO (Sparse Voxel Octree).

dsd 15.09.2011 23:24

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

moka 16.09.2011 14:06

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

Reizel 18.09.2011 16:24

Ответ: Странное.
 
Блин а чо все вдруг кинулись ландшафты генерить?? Рандом, я , теперь dsd...

dsd 18.09.2011 20:16

Ответ: Странное.
 
Это сезонное, не все просто сознаются...

dsd 19.09.2011 14:37

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

Это оно меня ко мне посылает или дальше?

Randomize 19.09.2011 15:20

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

Сообщение от Павел (Сообщение 202557)
Блин а чо все вдруг кинулись ландшафты генерить?? Рандом, я , теперь dsd...

Я ещё с прошлого лета генерю)

genroelgvozo 19.09.2011 19:33

Ответ: Странное.
 
Вот кстати создание двумерного массива (привычного с двумя индексами) через кучу:
Код:

int n=100;
int** a=new int*[n];
for(int i=0;i<n;i++) a[i]=new int[n];
a[99][99]=5;

а вообще удобнее через вектор, хотя и медленнее (ну это когда как надо)

HolyDel 19.09.2011 21:46

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

хотя и медленнее
ну, не так уж и медленнее.
обращение к элементу - равноценно с обычным массивом по скорости

dsd 26.09.2011 21:52

Ответ: Странное.
 
сфера без лишних точечек на полюсах... Правда из двух поверхностей...


PHP код:

Handle mCreateSphere(int segments) {
Handle mesh=xCreateMesh();
Handle surf=xCreateSurface(mesh);
//создание плоскости
for(int i=0;i<=2*segments;i++){
    for(
int j=0;j<=2*segments;j++){
        
int v0=xAddVertex(surf,i,j,0);
    }}
int qvert=xCountVertices(surf);
    for(
int i=0;i<qvert-2*segments-1;i++){
        
int v0=i;
        
int v1=i+1;
        
int v2=i+2*segments+1;
        
int v3=v2+1;
            if(
v3<qvert && xMod(i,2*segments+1)!=2*segments){ xAddTriangle(surf,v1,v2,v3); xAddTriangle(surf,v0,v2,v1);}}
//теперь выгибание плоскости по полусфере
    
for(int i=0;i<qvert;i++){
    
double x=xVertexX(surf,i);
    
double y=xVertexY(surf,i);
    
double radius;
    if(
fabs(x-segments)>fabs(y-segments)){radius=fabs(x-segments);} else {radius=fabs(y-segments);}
    
x=x-segments;
    
y=y-segments;
    
double l=sqrt(x*x+y*y);
    if (
l!=0){x=x/ly=y/l;}
    
y=y*sin(0.5*M_PI*radius/segments);
    
x=x*sin(0.5*M_PI*radius/segments);
    
double z=cos(0.5*M_PI*radius/segments);
    
xVertexCoords(surf,i,x,y,z);
    
xVertexNormal(surf,i,x,y,z);
//половинка сферы готова
    
}
// вторая часть.
Handle surf2=xCreateSurface(mesh);
//создание плоскости
for(int i=0;i<=2*segments;i++){
    for(
int j=0;j<=2*segments;j++){
        
int v0=xAddVertex(surf2,i,j,0);
    }}
    for(
int i=0;i<qvert-2*segments-1;i++){
        
int v0=i;
        
int v1=i+1;
        
int v2=i+2*segments+1;
        
int v3=v2+1;
            if(
v3<qvert && xMod(i,2*segments+1)!=2*segments){ xAddTriangle(surf2,v2,v1,v3); xAddTriangle(surf2,v2,v0,v1);}}
//теперь выгибание плоскости по полусфере
    
for(int i=0;i<qvert;i++){
    
double x=xVertexX(surf2,i);
    
double y=xVertexY(surf2,i);
    
double radius;
    if(
fabs(x-segments)>fabs(y-segments)){radius=fabs(x-segments);} else {radius=fabs(y-segments);}
    
x=x-segments;
    
y=y-segments;
    
double l=sqrt(x*x+y*y);
    if (
l!=0){x=x/ly=y/l;}
    
y=y*sin(0.5*M_PI*radius/segments);
    
x=x*sin(0.5*M_PI*radius/segments);
    
double z=-cos(0.5*M_PI*radius/segments);
    
xVertexCoords(surf2,i,x,y,z);
    
xVertexNormal(surf2,i,x,y,z);}

return 
mesh;



Mr_F_ 26.09.2011 21:59

Ответ: Странное.
 
какая-то сетка больно неоднородная. в максе geosphere получше будет.

dsd 26.09.2011 22:13

Ответ: Странное.
 
Это совсем не геосфера, выпрямил решетку :)
И геосфера строится вообще не полюдски, меня все эти икосоэдры пугают пока:)

PHP код:

Handle mCreateSphere(int segments) {
Handle mesh=xCreateMesh();
Handle surf=xCreateSurface(mesh);
//создание плоскости
for(int i=0;i<=2*segments;i++){
    for(
int j=0;j<=2*segments;j++){
        
int v0=xAddVertex(surf,i,j,0);
    }}
int qvert=xCountVertices(surf);
    for(
int i=0;i<qvert-2*segments-1;i++){
        
int v0=i;
        
int v1=i+1;
        
int v2=i+2*segments+1;
        
int v3=v2+1;
            if(
v3<qvert && xMod(i,2*segments+1)!=2*segments){

                if(
xVertexX(surf,i)>=segments && xVertexY(surf,i)<segments){ xAddTriangle(surf,v1,v2,v3); xAddTriangle(surf,v0,v2,v1);}
                if(
xVertexX(surf,i)<segments && xVertexY(surf,i)>=segments){ xAddTriangle(surf,v1,v2,v3); xAddTriangle(surf,v0,v2,v1);}
                if(
xVertexX(surf,i)>=segments && xVertexY(surf,i)>=segments){ xAddTriangle(surf,v0,v3,v1);xAddTriangle(surf,v2,v3,v0);}
                if(
xVertexX(surf,i)<segments && xVertexY(surf,i)<segments){ xAddTriangle(surf,v0,v3,v1);xAddTriangle(surf,v2,v3,v0);}
                }}

//теперь выгибание плоскости по полусфере
    
for(int i=0;i<qvert;i++){
    
double x=xVertexX(surf,i);
    
double y=xVertexY(surf,i);
    
double radius;
    if(
fabs(x-segments)>fabs(y-segments)){radius=fabs(x-segments);} else {radius=fabs(y-segments);}
    
x=x-segments;
    
y=y-segments;
    
double l=sqrt(x*x+y*y);
    if (
l!=0){x=x/ly=y/l;}
    
y=y*sin(0.5*M_PI*radius/segments);
    
x=x*sin(0.5*M_PI*radius/segments);
    
double z=cos(0.5*M_PI*radius/segments);
    
xVertexCoords(surf,i,x,y,z);
    
xVertexNormal(surf,i,x,y,z);
//половинка сферы готова
    
}
// вторая часть.
Handle surf2=xCreateSurface(mesh);
//создание плоскости
for(int i=0;i<=2*segments;i++){
    for(
int j=0;j<=2*segments;j++){
        
int v0=xAddVertex(surf2,i,j,0);
    }}
    for(
int i=0;i<qvert-2*segments-1;i++){
        
int v0=i;
        
int v1=i+1;
        
int v2=i+2*segments+1;
        
int v3=v2+1;
            if(
v3<qvert && xMod(i,2*segments+1)!=2*segments){
                if(
xVertexX(surf2,i)>=segments && xVertexY(surf2,i)<segments){ xAddTriangle(surf2,v2,v1,v3); xAddTriangle(surf2,v2,v0,v1);}
                if(
xVertexX(surf2,i)<segments && xVertexY(surf2,i)>=segments){ xAddTriangle(surf2,v2,v1,v3); xAddTriangle(surf2,v2,v0,v1);}
                if(
xVertexX(surf2,i)>=segments && xVertexY(surf2,i)>=segments){ xAddTriangle(surf2,v3,v0,v1);xAddTriangle(surf2,v3,v2,v0);}
                if(
xVertexX(surf2,i)<segments && xVertexY(surf2,i)<segments){ xAddTriangle(surf2,v3,v0,v1);xAddTriangle(surf2,v3,v2,v0);}
}}
//теперь выгибание плоскости по полусфере
    
for(int i=0;i<qvert;i++){
    
double x=xVertexX(surf2,i);
    
double y=xVertexY(surf2,i);
    
double radius;
    if(
fabs(x-segments)>fabs(y-segments)){radius=fabs(x-segments);} else {radius=fabs(y-segments);}
    
x=x-segments;
    
y=y-segments;
    
double l=sqrt(x*x+y*y);
    if (
l!=0){x=x/ly=y/l;}
    
y=y*sin(0.5*M_PI*radius/segments);
    
x=x*sin(0.5*M_PI*radius/segments);
    
double z=-cos(0.5*M_PI*radius/segments);
    
xVertexCoords(surf2,i,x,y,z);
    
xVertexNormal(surf2,i,x,y,z);}

return 
mesh;



dsd 27.09.2011 13:48

Ответ: Странное.
 
Мне кажется или на мою сферу текстура таки ровней накладывается?


.Squid 27.09.2011 15:20

Ответ: Странное.
 
На сферу справа надо накладывать текстуру 2:1.

dsd 27.09.2011 15:31

Ответ: Странное.
 
Разве это уберет сжатие у полюсов? Ведь обычная сфера текстурится прилично только в областях близких к экватору, или нет?

.Squid 27.09.2011 15:54

Ответ: Странное.
 
А на скриншотах полюса показаны что ли? Я имел в виду, что, если наложить на правую сферу текстуру 2:1, то на экваторе не будет таких растянутостей.

dsd 27.09.2011 16:00

Ответ: Странное.
 
Ну а я, в общем, заговнокодил сферу без таких искажений у полюсов :)


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

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