关于基于vtk的paraview里transform的问题

Areslp Areslp 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我想把一个向量a变到向量b的位置上,a和b共顶点,只需要做一个旋转,如何求欧拉角
我在网上查到先求旋转轴,加a和b之间的夹角为四元数,再从四元数用公式反求欧拉角
我想问在求四元数的时候旋转轴是否需要先归一化,然后想请人看看代码的问题,因为结果总是不对,自己又看不出问题T_T。

try: paraview.simple
except: from paraview.simple import *
paraview.simple._DisableFirstRenderCameraReset()
from math import *
from numpy import *
from numpy.linalg import *


f=open('D.txt')
for line in iter(f):
# print line
items=line.split()
arrow=Arrow()
arrow = GetActiveSource()
arrow.TipRadius = 0.05
arrow.TipResolution = 32
arrow.ShaftRadius = 0.01
arrow.TipLength = 0.2
arrow.ShaftResolution = 32
dr=GetDisplayProperties(arrow)
dr.DiffuseColor = [1.0, 0.0, 0.0]
dr.Origin = [0.0, 0.0, 0.0]
dr.Position = [2.69616, 15.2011, -2.68065]
dr.Scale = [0.02, 0.02, 0.02]
e=array([1, 0, 0]) #这里是a
print 'e:',e
u=array([float(items[0]),float(items[1]),float(items[2])]) #这里是b
print 'u:',u


v=cross(u,e) #旋转轴
print 'v:',v
print 'norm(v):',norm(v)
v=v/norm(v)


print 'u*e:',dot(u,e)
a=acos(dot(u,e))
q=array([cos(a/2),sin(a/2)*v[0],sin(a/2)*v[1],sin(a/2)*v[2]]) #四元数
print 'q:',q
q=q/norm(q)
print 'normalized q:',q
w=q[0]
x=q[1]
y=q[2]
z=q[3]
#用公式反求的欧拉角
ax=atan2(2*(w*x+y*z),1-2*(x**2+y**2))
ay=arcsin(2*(w*y-z*x))
az=atan2(2*(w*z+x*y),1-2*(y**2+z**2))
print 'ax:',ax,'ay:',ay,'az:',az

dr.Orientation = [180*ax/pi,180*ay/pi,180*az/pi]
f.close()

Render()
...全文

相关推荐

评论 1
收藏 已收藏
分享
返回顶部
Areslp
机器视觉 4,514 成员 15,347 内容