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

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.

Есть волшебный флаг или надо переписывать?
Меш создается так:
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;

Правильно:

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


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

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием