首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >平移坐标,然后在X和Y方向上旋转坐标,使Z‘指向原点

平移坐标,然后在X和Y方向上旋转坐标,使Z‘指向原点
EN

Stack Overflow用户
提问于 2019-06-12 23:06:05
回答 1查看 54关注 0票数 0

我想建立一个矩阵( 4x4或3x3来转换XYZ->X'Y' Z‘),它将把我的原点平移{x,y,z},然后旋转矩阵,使Z’轴指向原点{X=0,Y=0,Z=0}

我试着绕任意轴旋转两次,然后独立平移,但是一旦坐标改变了一次,我的X'Y'Z‘坐标系的结果位置就会出现错误

EN

回答 1

Stack Overflow用户

发布于 2019-06-20 07:02:32

我解决这个问题的方法是绕任意轴旋转2圈,然后从@0x5453开始计算LookAt矩阵。附件是代码,其中Mv是最终的4x4矩阵:

` `def findWorld2Cam(x,y,z):

代码语言:javascript
复制
#   EXTRINSIC
camtheta=np.arctan(location[0]/location[2])
T=np.eye(4)
T[0:3,3]=-location
u=[0,1,0]
theta=camtheta
Rtheta=np.array([[np.cos(theta) + u[0]**2* (1 - np.cos(theta)), 
   u[0]* u[1]* (1 - np.cos(theta)) - u[2]* np.sin(theta), 
   u[0] *u[2]* (1 - np.cos(theta)) + u[1]* np.sin(theta), 0],
  [u[1] *u[0]* (1 - np.cos(theta)) + u[2]* np.sin(theta), 
   np.cos(theta) + u[1]**2 *(1 - np.cos(theta)), 
   u[1] *u[2]* (1 - np.cos(theta)) - u[0] *np.sin(theta), 0],
  [u[2] *u[0]* (1 - np.cos(theta)) - u[1] *np.sin(theta), 
   u[2]* u[1] *(1 - np.cos(theta)) + u[0]* np.sin(theta), 
   np.cos(theta) + u[2]**2 *(1 - np.cos(theta)), 0], [0, 0, 0, 1]])
#u=np.dot(Rtheta,[1,0,0,1])
u=[1,0,0]
camphi=np.arctan(location[1]/location[2])
phi=-camphi
Rphi=np.array([[np.cos(phi) + u[0]**2* (1 - np.cos(phi)), 
   u[0]* u[1]* (1 - np.cos(phi)) - u[2]* np.sin(phi), 
   u[0] *u[2]* (1 - np.cos(phi)) + u[1]* np.sin(phi), 0],
  [u[1] *u[0]* (1 - np.cos(phi)) + u[2]* np.sin(phi), 
   np.cos(phi) + u[1]**2 *(1 - np.cos(phi)), 
   u[1] *u[2]* (1 - np.cos(phi)) - u[0] *np.sin(phi), 0],
  [u[2] *u[0]* (1 - np.cos(phi)) - u[1] *np.sin(phi), 
   u[2]* u[1] *(1 - np.cos(phi)) + u[0]* np.sin(phi), 
   np.cos(phi) + u[2]**2 *(1 - np.cos(phi)), 0], [0, 0, 0, 1]])
R=np.dot(Rphi,Rtheta)
up1=np.dot(R,[0,1,0,1])

theta=np.arctan(location[0]/location[2])
phi=np.arctan(location[1]/location[2])
l=[0,0,0]
Mt=np.eye(4)
F=l-location
Mt[0:3,3]=-location
forward=F/np.linalg.norm(F)
up=up1[0:3]/np.linalg.norm(up1[0:3])
left=np.cross(up,forward)
Mr=np.eye(4)
Mr[0,0:3]=left
Mr[1,0:3]=up
Mr[2,0:3]=forward
Mv=np.dot(Mr,Mt)
return Mv
`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56565308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档