Arx中文字的三维显示(修改版)

 

AutoCAD中,文字的显示是通过文字位置,所在平面,以及文字对应的角度,来确定文字如何显示。
对于文字位置和所在的平面,可以很容易的确定。那对于文字的角度呢?它是X轴与文字方向的夹角吗?如果文字应该在的方向是个三维向量,那AcDbText::setRotation() 的角度到底应该是多少?

以下将文字所在的平面向量称为 normal,文字的角度称为 angle,文字实际显示的方向向量为 vt。

在二维平面中,即 normal==AcGeVector3d::kZAxis 时,angle为 X轴与文字方向的夹角,即 angle=AcGeVector3d::kXAxis.angleTo(vt);

在三维平面中,文字的角度如何确定呢?
AcDbText::setRotation() 的函数帮助中有这样一句话:

The rotation angle is relative to the X axis of the text's OCS, with positive angles going counterclockwise when looking down the Z axis toward the origin.
看了以上的说明,还是有点不明白,text的角度是 OCX 下的 X 轴在从 Z 轴俯视下的逆时针的角度。而 OCS X轴,在三维下是如何确定的呢?

The OCS X axis is determined by using the text's normal vector, the WCS Z axis, and the arbitrary axis algorithm.
text的OCS下的 X轴是由 text的平面向量,世界坐标系的Z轴,以及任意轴算法确定。

看到这里,好像有点明白了,不过什么是任意轴算法?上AutoCAD的网站上查了一下,终于是彻底明白了。

任意轴算法是AutoCAD内部用于生成实体坐标系的一种算法。
通过一个给定的单位向量即normal向量,作为坐标系的 Z轴,生成对应的 X轴向量,Y轴向量通过右手法则确定。

如下是具体的算法:

  AcGeVector3d Ax;
  if ((fabs (normal.x) < 1.0/64) && (fabs (normal.y) < 1.0/64) ) 
   Ax = AcGeVector3d::kYAxis.crossProduct(normal);
  else
   Ax = AcGeVector3d::kZAxis.crossProduct(normal);
  Ax.normalize();
  angle=Ax.angleTo(vt);
说明:1/64是AutoCAD用来判断平面向量是否接近世界坐标系的Z轴的边界条件

这样就可以正确求出文字在OCX下的角度值了

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值