Тема: Поворот матрицы не вокруг нужной точки
Не могу понять в чем дело, полученный solid из полилинии , строится не на прямой. Точки asp и aep задаются пользователем в чертеже (основная функция), затем вызывается ф-ция s_mysolid. Строю 3D полилинию в плоскости XY , выдавливаю ее, и начинаю вращать с помощью матрицы, полученный Solid. Solid поворачивается (как нужно) параллельно прямой образующейся при указании пользователем двух точек, проблема в том, но на расстоянии от нее (почему не понимаю). При чем, если указать первой точку 0,0,0, вторую не важно где, solid строится прямо на прямой как и нужно. Вопрос почему при указании точек, матрица поворота solid'а не поворачивается вокруг данной точки?
AcDbEntity *s_mysolid(AcGePoint3d asp, AcGePoint3d aep, double s_s, double s_h, double s_t) { AcGePoint3d Pt,ao(0, 0, 0); AcGeVector3d v = aep-asp, amv = asp-ao; /*вектор между 0 и нач точкой трубы*/ v.normalize(); v = v.normal(); AcGePlane apl1(asp,v); /*план, ортогональный оси */ double len = asp.AcGePoint3d::distanceTo(aep); // длина double len1=apl1.distanceTo(asp); AcDbObjectId lineId; AcDb3dPolyline *pLine; AcDbBlockTable *pBlockTable; acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord; pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite); pBlockTable->close(); AcGePoint3dArray vertices; Pt.x=asp.x; Pt.y=asp.y; Pt.z=asp.z; vertices.append(Pt); Pt.x =asp.x+s_b+s_s/2; Pt.y =asp.y+s_t; Pt.z=asp.z; vertices.append(Pt); Pt.x =asp.x+2*s_b; Pt.y =asp.y+s_t; Pt.z=asp.z; vertices.append(Pt); Pt.x =asp.x+2*s_b; Pt.y =asp.y; Pt.z=asp.z; vertices.append(Pt); Pt.x =asp.x; Pt.y =asp.y; Pt.z=asp.z; vertices.append(Pt); AcDbVoidPtrArray regions; AcDbVoidPtrArray voidPtrArr; pLine = new AcDb3dPolyline(AcDb::k3dSimplePoly, vertices); pLine->setDatabaseDefaults(); pBlockTableRecord->appendAcDbEntity(lineId, pLine); pBlockTableRecord->close(); pLine->close(); int a_n1; AcDbVoidPtrArray acircs1; a_n1 = acircs1.append(pLine); AcDbRegion *pRegion; AcDbRegion::createFromCurves(acircs1, regions); assert(regions.length() == 1); pRegion = AcDbRegion::cast((AcRxObject*)regions[a_n1]); AcDb3dSolid *pSolid = NULL; pSolid = new AcDb3dSolid; pSolid->extrude(pRegion,len,0); // pSolid->createFrustum(len, 40, 20, 80); если строить цилиндр, то он строится по прямой. AcGeMatrix3d mat(AcGeMatrix3d::translation(len1*v) /*Вектор перемещения*/ *AcGeMatrix3d::planeToWorld(v)); pSolid->transformBy(mat); AcGeVector3d x(1, 0, 0), y(0, 1, 0), z(0, 0, 1); AcGePoint3d moveBy(v[0] , v[1] , v[2]), amp (amv[0], amv[1], amv[2]); mat.setCoordSystem(moveBy, x, y, z); pSolid->transformBy(mat); mat.setCoordSystem(amp, x, y, z); pSolid->transformBy(mat); return pSolid; }