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

Areslp 2012-05-29 08:54:30
我想把一个向量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()
...全文
403 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
李超 2012-11-14
  • 打赏
  • 举报
回复
你好,我也正想学习paraView源码,加QQ603035273吧,大家一同学习

4,499

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧