|
系统变量viewtwist 表示的是WCS下相对于观察方向的up向量和DCS下实际的视口UP向量之间的夹角。
下面代码使用view 方向,构建一个UP 向量(垂直于观察方向),然后计算出实际视口的UP向量,然后测量出他们之间的夹角。- #define PI 3.14159265359
- // utility to calculate the viewtwist to illustrate how this works
- //
- void getViewTwist()
- {
- // 首先获得view方向
- struct resbuf viewRb;
- acedGetVar( "VIEWDIR", &viewRb );
- AcGeVector3d dirVector = asVec3d(viewRb.resval.rpoint);
- // 确保在WCS下
- acdbUcs2Wcs( asDblArray( dirVector), asDblArray( dirVector), Adesk::kTrue );
- //计算这个VIEW方向向量的缺省的 upVector
- AcGeVector3d sideVector = dirVector.perpVector();
- AcGeVector3d upVector = dirVector.crossProduct(sideVector).normal();
- ads采用point UpVec;
- asVec3d( UpVec) = upVector;
- // 计算实际的 upVector, by applying the view transformation.
- struct resbuf from, to;
- from.restype = RTSHORT;
- from.resval.rint = 0; // WCS
- to.restype = RTSHORT;
- to.resval.rint = 2; // MS DCS
- acedTrans(UpVec, &from, &to, TRUE, UpVec);
- // 计算 twist angle
- double safeViewTwist;
- safeViewTwist = atan2(UpVec[Y],UpVec[X]) - PI/2 ;
- // 在数学上,我们已经完成了计算,有个问题是系统吧变量VIEWTWIST的值在0到2PI之间,所以我们继续
- //如果计算结果为负数
- if( safeViewTwist < -1e-6 )
- safeViewTwist+= (PI * 2.0 );
- acutPrintf("\nsafeViewTwist: %f", safeViewTwist);
- // 下面来检查下计算结果和系统变量VIEWTWIST值进行比较是否一样。
- struct resbuf viewTwist;
- acedGetVar("VIEWTWIST", &viewTwist );
- acutPrintf("\nReal VIEWTWIST: %f", viewTwist.resval.rreal );
- }
复制代码 |
|