找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1648|回复: 6

[分享] 模型空间到图纸空间的转换矩阵函数

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-5-5 01:17:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[sell=5]
[pcode=cpp,true]//////////////////////////////////////////////////////////////////////////
void ms2ps( AcDbViewport*pVp, AcGeMatrix3d &resultMat)
{
        // first get all the data
        AcGeVector3d viewDirection = pVp->viewDirection();
        AcGePoint2d centre2d = pVp->viewCenter();
        AcGePoint3d viewCenter = AcGePoint3d( centre2d.x, centre2d.y, 0);
        
        AcGePoint3d viewTarget = pVp->viewTarget ();
        double twistAngle = -pVp->twistAngle();
        AcGePoint3d centerPoint = pVp->centerPoint();
        double viewHeight = pVp->viewHeight();
        double height = pVp->height();
        double width = pVp->width();
        double scaling = viewHeight / height;
        double lensLength = pVp->lensLength();
        

        // prepare the transformation
        AcGeVector3d xAxis, yAxis, zAxis;
        zAxis = viewDirection.normal();
        xAxis = AcGeVector3d::kZAxis.crossProduct( viewDirection );
        
        if( !xAxis.isZeroLength() ) {
                xAxis.normalize();
                yAxis = zAxis.crossProduct( xAxis );
        } else if( zAxis.z < 0 ) {
                xAxis = -AcGeVector3d::kXAxis;
                yAxis = AcGeVector3d::kYAxis;
                zAxis = -AcGeVector3d::kZAxis;
        } else {
                xAxis = AcGeVector3d::kXAxis;
                yAxis = AcGeVector3d::kYAxis;
                zAxis = AcGeVector3d::kZAxis;
        }
        
        AcGeMatrix3d dcs2wcs; // display coordinate system (DCS) to world coordinate system (WCS)
        AcGeMatrix3d ps2Dcs; // paperspace to DCS
        
        
        // First initialise with a transformation to centerPoint
        ps2Dcs = AcGeMatrix3d::translation( AcGePoint3d::kOrigin - centerPoint);
        
        // then scale for the view
        ps2Dcs = ps2Dcs * AcGeMatrix3d::scaling( scaling, centerPoint);
        
        // then adjust to the viewCenter
        dcs2wcs = AcGeMatrix3d::translation( viewCenter - AcGePoint3d::kOrigin);
        
        // Then transform for the view direction
        AcGeMatrix3d matCoords;
        matCoords.setCoordSystem( AcGePoint3d::kOrigin, xAxis, yAxis, zAxis);
        
        dcs2wcs = matCoords * dcs2wcs;
        
        // Then adjust for the viewTarget
        dcs2wcs = AcGeMatrix3d::translation( viewTarget - AcGePoint3d::kOrigin) * dcs2wcs;
        
        // Then the twist angle
        dcs2wcs = AcGeMatrix3d::rotation(twistAngle, zAxis, viewTarget ) *dcs2wcs;
        
        AcGeMatrix3d perspMat;
        if( pVp->isPerspectiveOn())
        {
                // we do special perspective handling
                double viewSize = viewHeight;
                double aspectRatio = width / height;
               
                double adjustFactor = 1.0 / 42.0;
                double adjustedLensLength = viewSize * lensLength * sqrt ( 1.0 +
                        aspectRatio * aspectRatio ) * adjustFactor;
               
                double eyeDistance = viewDirection.length();
                double lensDistance = eyeDistance - adjustedLensLength;
               
               
                double ed = eyeDistance;
                double ll = adjustedLensLength;
                double l = lensDistance;
               
               
                perspMat.entry[2][2] = (ll - l ) / ll;
                perspMat.entry[2][3] = l * ( ed - ll ) / ll;
                perspMat.entry[3][2] = -1.0 / ll;
                perspMat.entry[3][3] = ed / ll;               
        }
        
        resultMat = ps2Dcs.inverse() * perspMat * dcs2wcs.inverse();
}

//////////////////////////////////////////////////////////////////////////
void ps2ms ( AcDbViewport*pVp, AcGeMatrix3d &resultMat )
{
        // Keep life simple, just invert the other way
        AcGeMatrix3d mat;
        ms2ps( pVp, mat );
        resultMat = mat.inverse();
        return;
}
[/pcode]
[/sell]

评分

参与人数 1D豆 +2 收起 理由
ScmTools + 2 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1632个

财富等级: 堆金积玉

发表于 2013-5-5 09:13:16 | 显示全部楼层
支持!希望后续能够看到LZ更精彩的贴!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

发表于 2014-1-3 05:32:37 | 显示全部楼层
看不懂的代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

发表于 2014-1-3 05:34:30 | 显示全部楼层
这个在lisp中可以引用吗?怎么用呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-1-3 18:06:40 来自手机 | 显示全部楼层
学习学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2017-10-31 19:09:44 来自手机 | 显示全部楼层
这个在lisp中可以引用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

发表于 2018-11-16 08:55:13 | 显示全部楼层
上当,不是lisp的,看不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-14 21:52 , Processed in 0.388490 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表