2010-11-10 96 views
6

目前我正在试图使用OpenGL(使用SDL)来绘制一个立方体的位置,我离开单击屏幕,然后去指向我右键单击屏幕的位置。寻找角度的X,Y,Z轴的三维 - 的OpenGL/C++

我可以成功地借鉴使用gluUnproject在我想要的位置的立方体 - 意义我已经知道我的立方体位于坐标。

但是我不知道如何计算都使我的立方体点在新位置需要的角度。

当然我仍在使用gluUnproject找到我右键点击的坐标,但我只知道如何绕Z轴使用2D图形旋转。例如之前,如果我想围绕Z轴旋转一个四边形(当然,这将是一个自上而下的视图,其中Z轴仍在“穿过”屏幕)2D中我会做类似:

angle = atan2(mouseCoordsY - quadPosY, mouseCoordsX - quadPosX); 
glRotatef(angle*180/PI, 0, 0, 1); 

我的问题是,我该如何去做这个3D?

  • 我是否需要像上面那样计算每个轴的角度?
  • 如果让我怎么计算绕X轴和Y轴旋转的角度?
  • 如果不是,我应该用什么方法来达到我想要的效果?

任何帮助是极大的赞赏。

+0

如何指定Z坐标每个鼠标点击来表示?如果你只设置为0,那么2D几何就足够了,我猜这不是你的意图。 – 2010-11-10 10:09:22

+0

在3D空间中单击应该定义一个光线,而不是一个点。我很想知道你是如何实现定位立方体的。 – tafa 2010-11-10 10:15:10

+0

@Marcelo Cantos:如果我错误地理解了你的问题,请原谅我,但我对此很陌生,所以虽然我想我知道你在问什么,但我仍然可能有错误的想法。基本上,如果我的立方体在(100,200,300),并且点击(400,500,600),我需要找到我需要旋转立方体的角度,以便让它看到第二组坐标。 – 2010-11-10 10:15:46

回答

9

如果你的立方体是在A =(X0,Y0,Z0)

如果你的立方体目前正在研究B =(X1,Y1,Z1)

,如果你希望它看起来在那么C =(x2,y2,z2)

令V1是从A矢量到B

V1 = B - 甲

和V2是从A所述一个至C

V2 = C - 甲

首先规范化他们。

v1 = v1/|v1| 
v2 = v2/|v2| 

然后计算出的旋转角度和旋转轴为

angle = acos(v1*v2) //dot product 
axis = v1 X v2 //cross product 

你可以调用glRotate与

glRotate(angle, axis[0], axis[1], axis[2]) 
+0

非常感谢你的回答tafa!过去几天我一直在寻找关于这个问题的教程和其他资源,并且已经用dot产品测试过的东西,但是因为我只是从2D来的,所以对我来说没有多大意义,但是你的回答已经以非常明确的方式解释了我需要知道的一切,没有任何资源I发现在谷歌可以,谢谢 – 2010-11-10 12:14:48

+0

@柠檬柠檬,很高兴听到这一点。 – tafa 2010-11-10 12:24:20