【MSCE U13 C++】放置cell时,如何设置旋转矩阵使得cell的方向和鼠标一致?

老师,您好

       请问一下,我看我想实现如下视频所示的,放置cell时,cell的方向和鼠标的方向一致,该如何设置旋转矩阵?谢谢。

Parents Reply Children
  • 郭老师,我还是实现不了,下面是我的半成品代码,您可以帮忙做个demo?感激不尽。

    MSElement CreateRoadMark(DPoint3dR basePt, DPoint3dR nextPoint)
    {
    	MSElement msElement;
    	DPoint3d scale = { 1,1,1 };
    	DPoint3d origin = { basePt.x, basePt.y, basePt.z };
    	DVec3d direction = DVec3d::FromStartEnd(basePt, nextPoint);
    	DVec3d z_axis = DVec3d::UnitZ();
    	DVec3d y_axis = DVec3d::FromCrossProduct(direction, z_axis);
    	DVec3d zz_axis = DVec3d::FromCrossProduct(direction, y_axis);
    	zz_axis.Normalize();
    	y_axis.Normalize();
    	double scale_length = basePt.Distance(nextPoint) / 10000 / 3;
    
    	RotMatrix rMatrix = RotMatrix::FromColumnVectors(scale_length*y_axis, direction, scale_length*zz_axis);
    	mdlSharedCell_create(&msElement, NULL, &origin, &rMatrix, &scale, L"直行_右转箭头", NULL, FALSE, 0, NULL);
    	if (SUCCESS != mdlSharedCell_makeSureDefExists(&msElement))
    	{
    		mdlDialog_openAlert(L"可能没有连接单元库FlatAssets.cell");
    		return msElement;
    	}
    	mdlSharedCell_setRange(&msElement, ACTIVEMODEL);
    	return msElement;
    }

  • 如下示例代码所示:

    void PlaceRoadCell(DPoint3dR ptOri, DPoint3dR ptTar)
    {
    	DPoint3d scale = { 1,1,1 }; 
    	DVec3d direction = DVec3d::FromStartEnd(ptOri, ptTar);
    	DVec3d z_axis = DVec3d::UnitZ();
    	DVec3d y_axis = DVec3d::FromCrossProduct(z_axis, direction);
    	DVec3d zz_axis = DVec3d::FromCrossProduct(direction, y_axis);
    	zz_axis.Normalize();
    	y_axis.Normalize();
    	direction.Normalize();
    	double scale_length = ptOri.Distance(ptTar) / ACTIVEMODEL->GetModelInfoCP()->GetUorPerMeter()/20;//20 is roarsign's length in the cell library
    	RotMatrix rMatrix = RotMatrix::FromColumnVectors(scale_length*direction, scale_length*y_axis, scale_length*zz_axis);
    	mdlCell_placeCell(&ptOri, &scale, false, &rMatrix, NULL, 0, false, 0, 0, L"RoadSign", NULL);
    }

    这是相应的单元库文件:

    Cell.dgn

    Answer Verified By: nian chen 

  • 谢谢郭老师,刚试了一下,确实可以,只是制作单元库的时候箭头要朝X轴才可以。顺便问一下,如果我的箭头不是朝向X轴,通过cell中的两个点构成的向量和我的鼠标点击的两个点构成的向量,通过这两个向量怎么算出变换矩阵?

  • 那就先构造旋转矩阵,把单元旋转到箭头朝向X轴的方向。