2016-02-28 156 views
0

我有一个绘制在(0,0,0)的对象,并且对象的方向是(0,0,1)。我试图旋转它以便与矢量对齐,比如vi =(vx,vy,vz)。OpenGL对象旋转

我所做的是以下几点:

v = (0, 0, 1); 
v_normal = (vnx, vny, vnz); 

跨产品,以获得正常的向量:

v_normal = v.cross(vi); 

由于法线,我计算了角度

thetax = arccos(vnx/length(v_normal)) 
thetay = arccos(vny/length(v_normal)) 
thetaz = arccos(vnz/length(v_normal)) 

和然后我做旋转:

glRotatedf(thetax, 1, 0, 0) 
glRotatedf(thetay, 0, 1, 0) 
glRotatedf(thetaz, 0, 0, 1). 

这样做后,我有一些奇怪的。任何人都可以解释如何在交叉产品之后获得旋转角度?谢谢!

+0

“*对象的方向是(0,0,1)*”这是什么意思?另外,为什么你需要3个角度?为什么不只是角度/轴旋转指向你想要指向的位置? –

+0

假设对象是一个箭头,它指向(0,0,1)。我能想到的另一种方法是计算thetax = arctan(sqrt(y^2 + z^2)/ x)和thetay = arctan(z/y)。然后做glRotatedf(thetax,1,0,0)和glRotatedf(thetay,0,1,0)。我不知道这是否有效。请给一些帮助。非常感谢。 – user3204065

回答

0

每当您认为需要旋转一个基于三个轴向旋转的物体时,就停止!找到解决问题的另一种方法。例如,你可以使用你的设备。你正确地开始:你得到了对象当前指向的位置和你希望它指向的位置之间的交叉乘积。该矢量是垂直于其他两个矢量的矢量。这意味着......如果你想在两个向量之间旋转,那么交叉产品就是来旋转。

glRotatef(没有glRotate**df**。它是fd,不是两者)执行角度轴旋转。你给它一个角度和轴旋转。你刚刚计算出轴线;你只需要原始方向和所需方向之间的角度。

这也是微不足道的。根据cross-product的性质,叉积矢量的长度是两个输入矢量之间角度的正弦。所以角度是叉积的长度的倒数。

auto v_axis = v.cross(vi); 
auto angle = arcsin(length(v_axis)); 
glRotatef(angle, v_axis[0], v_axis[1], v_axis[2]); 

您执行一次循环而不是三次循环。

当然,您需要考虑vvi指向彼此的可能性。在这种情况下,十字产品将具有非常小的长度。如果叉积的长度非常小,则基本上需要选取一个与其中一个垂直的任意矢量,然后使用180度的角度。