如图 想将上图中每个围栅中所有的内容进行平移旋转到X轴上
平移实际不是指定的平移终点,而是平移的量,例如下图所示的构造Transform实例的函数,translation这个参数并不是指的是将元素平移到这个点上,而是将元素平移这个量,例如translation传(1000,0,0)的话表示将元素沿+X方向平移1000。对于您图中的情况,显然是每个围栅都要确定一个平移量,而且还要构造一个旋转才能完成最终的变换。
我这有个思路是想把所有元素加到cell中一起处理
没必要,除非您最终目的就是为了把各个围栅中的元素合并成一个cell,还是我上边回复的,您需要对每一个围栅构造一个旋转变换矩阵,然后对这个围栅内的所有元素都施加这个旋转变换即可,构造旋转矩阵请参考如下代码:
FenceManagerR fenceManager = FenceManager::GetManager(); if (fenceManager.IsFenceActive() == false) return; DgnModelP pActiveModel = ISessionMgr::GetActiveDgnModelP(); FenceParamsP fenceParams = FenceParams::Create(pActiveModel); if (SUCCESS != FenceManager::GetManager().InitFromActiveFence(*fenceParams, true, true, FenceClipMode::Copy)) return; ClipPrimitivePtr clipPri = fenceParams->GetClipVector()->at(0); ClipPolygonCP clipPoly= clipPri->GetPolygon(); bvector< DPoint3d> ptVec; TransformP tran= fenceParams->GetTransform(); mdlTMatrix_getInverse(tran, tran); for (ClipPolygon::const_iterator iter = clipPoly->begin(); iter != clipPoly->end(); ++iter) { DPoint3d curPt = { iter->x,iter->y,0 }; mdlTMatrix_transformPoint(&curPt, tran); ptVec.push_back(curPt); } DVec3d vecX = DVec3d::FromStartEnd(ptVec[0], ptVec[1]); vecX.Normalize(); DVec3d vecZ = DVec3d::UnitZ(); DVec3d vecY; vecY.CrossProduct(vecZ, vecX); RotMatrix rMatrix = RotMatrix::FromRowVectors(vecX, vecY, vecZ); Transform tranTo = Transform::FromMatrixAndFixedPoint(rMatrix, ptVec[0]); Transform tranTemp = Transform::FromIdentity(); DPoint3d offset = ptVec[0]; offset.Negate(); tranTemp.SetTranslation(offset); mdlTMatrix_multiply(&tranTo, &tranTemp, &tranTo);
郭老师 想尝试用这两个函数操作 但是里边的参数有点不太清楚
这是我目前的代码 并没有达到我想要的效果
不知道我上边的代码您是否测试过,mdlTMatrix_fromRotationAroundLine是构造一个绕指定直线旋转指定角度的旋转矩阵,第二三个参数制定了这条直线,最后一个参数指定了角度,角度是弧度制,mdlTMatrix_rotateByAngles应该是构造一个绕inTransP的X轴,Y轴,Z轴旋转指定角度的旋转变换矩阵。
MS学习资源:
MicroStation Wednesday视频分享
深入探讨MicroStation DGN基本概念系列
一步步学习MicroStation CE Addin开发
一步步学习MicroStation CE MDL开发
郭老师 mdlTMatrix_fromRotationAroundLine如果想要在XoY平面旋转 第二第三个参数两个点是不是应该是从旋转点出发的Z轴
基础有点差 上边的代码还是有点没看特别明白