admin 发表于 2024-3-14 19:29:54

[每日一码] 系统变量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]
查看完整版本: [每日一码] 系统变量viewtwist值如何通过数学方法计算