马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
XdRx_Matrix_SetRotation的Bug。
以一条直线绕其一个端点旋转为例:
1 构造矩阵
 - _$ (setq mat (xdrx_matrix_identity))
- ((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
2 取直线端点
 - _$ (setq pt (getpoint))
- (35.3426 61.0671 0.0)
3 构造矩阵
 - _$ (setq mat1 (xdrx_matrix_settranslation mat pt))
- ((1.0 0.0 0.0 35.3426) (0.0 1.0 0.0 61.0671) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
- _$ (setq mat1 (xdrx_matrix_setrotation mat1 (/ pi 3) '(0. 0. 1.) pt))
- ((0.5 -0.866025 0.0 105.9) (0.866025 0.5 0.0 60.9931) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
- _$
4 变换实体
- _$ (xdrx_entity_transformedcopy (entlast) mat1)
- T
复制代码
5 白色为变换后的实体,红色为期望的实体,为何?
据试验,旋转后矩的第四列(仅对(0.0 0.0 1.0)平面)应该是
- (mapcar '+ pt (xdrx_vector_rotate (mapcar '- pt) ang))
- pt ------ 旋转基点(与原矩阵的原点无关)
- ang ----- 旋转角度
复制代码
才可以到达Rotate的效果。
以下是修改的矩阵旋转函数(仅用于绕Z轴),大家试试与Xdrx_matrix_setrotation
的区别。xdrx_matrix_setrotation中的<转轴向量>用 (0.0 0.0 1.0)

- ;|
- matrix -- 矩阵 pt --旋转基点 ang -- 旋转角度
- |;
- (defun matrix_setrotation (matrix pt ang / pt1 vx vy vz rplst)
- (setq pt1 (mapcar '+ pt (xdrx_vector_rotate (mapcar '- pt) ang)))
- (setq rplst (mapcar '(lambda (x) (xdrx_vector_rotate x ang))
- (cdr (xdrx_matrix_getCoordsystem matrix))
- )
- )
- (setq vx (car rplst)
- vy (cadr rplst)
- vz (last rplst)
- )
- (list (list (car vx) (car vy) (car vz) (car pt1))
- (list (cadr vx) (cadr vy) (car vz) (cadr pt1))
- (list (last vx) (last vy) (last vz) (last pt1))
- '(0.0 0.0 0.0 1.0)
- )
- )
|