Мастер
Регистрация: 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/length; vy=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/length; vvy=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.
|