找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 148|回复: 2

[几何] XD::Mat:AlignToWCS

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2025-5-19 04:12:00 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Mat:AlignToWCS
调用格式: (XD::Mat:AlignToWCS Org Vx Vy)
参数说明: Org - 原点(3D 点列表),如 (0 0 0)
Vx - X 轴方向向量(3D 向量列表)
Vy - Y 轴方向向量(3D 向量列表)
返回值: 若 Vx 或 Vy 为零向量,返回单位矩阵;
否则返回一个包含两个矩阵的列表:(list m1 m2)
m1:UCS → WCS 变换矩阵
m2:WCS → UCS 变换矩阵
函数简介: 根据给定的原点 Org 和两个方向向量 Vx、Vy,生成将自定义坐标系(UCS)与世界坐标系(WCS)对齐的变换矩阵。
返回从 UCS → WCS 以及 WCS → UCS 的两个 4x4 仿射矩阵。
函数来源: 二次修改
函数作者: marting
适用版本: 不限 
最后更新时间: 2025-05-19
备注: -
演示图片: -

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

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

×
  1. ;;; XD::Mat:AlignToWCS
  2. ;;; 描述:
  3. ;;;   根据给定的原点 Org 和两个方向向量 Vx、Vy,生成将自定义坐标系(UCS)与世界坐标系(WCS)对齐的变换矩阵。
  4. ;;;   返回从 UCS → WCS 以及 WCS → UCS 的两个 4x4 仿射矩阵。
  5. ;;;
  6. ;;; 调用格式:
  7. ;;;   (XD::Mat:AlignToWCS Org Vx Vy)
  8. ;;;
  9. ;;; 参数说明:
  10. ;;;   Org - 原点(3D 点列表),如 (0 0 0)
  11. ;;;   Vx  - X 轴方向向量(3D 向量列表)
  12. ;;;   Vy  - Y 轴方向向量(3D 向量列表)
  13. ;;;
  14. ;;; 返回值:
  15. ;;;   若 Vx 或 Vy 为零向量,返回单位矩阵;
  16. ;;;   否则返回一个包含两个矩阵的列表:(list m1 m2)
  17. ;;;   m1:UCS → WCS 变换矩阵
  18. ;;;   m2:WCS → UCS 变换矩阵

  19. (defun XD::Mat:AlignToWCS (Org Vx Vy / Vz Rot ang Rot1 Tr m1 m2)
  20.   (if (or (equal Vx '(0 0 0) 1e-14) (equal Vy '(0 0 0) 1e-14))
  21.     '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))
  22.     (progn
  23.       (setq Vx  (XD::Vec:unit Vx))                          ; X Axis
  24.       (setq Vy  (XD::Vec:unit Vy))                          ; Y Axis
  25.       (setq Vz  (XD::Vec:unit (XD::Vec:vxv Vx Vy)))         ; Z Axis
  26.       (setq Vy  (XD::Vec:unit (XD::Vec:vxv Vz Vx)))         ; Recompute orthogonal Y Axis

  27.       ;; 计算从 UCS → WCS 的变换矩阵
  28.       (setq Rot  (xd::mat:rotation3d '(0 0 0) (-(angle '(0 0 0) Vx)) '(0 0 1)))
  29.       (setq ang  (xd::vec:angle Vz '(0 0 1.0)))
  30.       (setq Rot1 (xd::mat:rotation3d '(0 0 0) (- ang) Vx))
  31.       (setq Tr   (XD::Mat:DispToMatrix
  32.                    '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))
  33.                    (mapcar '- Org)))
  34.       (setq m1   (xd::mat:m*m Rot1 Tr))
  35.       (setq m1   (xd::mat:m*m Rot m1))

  36.       ;; 计算从 WCS → UCS 的变换矩阵
  37.       (setq Rot  (xd::mat:rotation3d '(0 0 0) (angle '(0 0 0) Vx) '(0 0 1.0)))
  38.       (setq Rot1 (xd::mat:rotation3d '(0 0 0) ang Vx))
  39.       (setq Tr   (XD::Mat:DispToMatrix
  40.                    '((1. 0. 0. 0.) (0. 1. 0. 0.) (0. 0. 1. 0.) (0. 0. 0. 1.))
  41.                    Org))
  42.       (setq m2   (xd::mat:m*m Tr Rot1))
  43.       (setq m2   (xd::mat:m*m m2 Rot))

  44.       (list m1 m2)
  45.     )
  46.   )
  47. )




评分

参与人数 1D豆 +5 收起 理由
sh_h + 5 热心帮忙奖!

查看全部评分

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

已领礼包: 779个

财富等级: 财运亨通

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-25 10:39 , Processed in 0.369759 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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