[每日一码] 系统变量viewtwist值如何通过数学方法计算
系统变量viewtwist 表示的是WCS下相对于观察方向的up向量和DCS下实际的视口UP向量之间的夹角。下面代码使用view 方向,构建一个UP 向量(垂直于观察方向),然后计算出实际视口的UP向量,然后测量出他们之间的夹角。#define PI3.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,UpVec) - 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 );
}
页:
[1]