我有一个以原点为中心的单位球体,我的相机也在原点居中。相机面向z = -1。 我通过首先绕x轴旋转相机然后绕z轴旋转来改变我的视点。这在opengl es 1.1中完成 glrotate(PHI,1,0,0); glrotate(THETA,0,0,1)
这实际上给了我一个摄像机视点,其中z =(0,0,1)始终是向上矢量。 如果我指定要查看的内容,使用gluLookAt会给我相同的结果。 我之前也定义了一个投影矩阵。
现在提出真正的问题:
我点击屏幕,我点击的第一个点通过投影矩阵和模型视图矩阵转换回来并存储。即 pl =屏幕上的像素位置,P =投影矩阵,M =模型视图矩阵,ps = 3d球面上的点
P * M * PS = PL 所以ps = inv(M)* inv(P)* pl
执行此步骤非常简单。下一部分不是。
现在我想点击屏幕上的任何其他位置,因此我得到一个plnew,我想找出Mnew将导致旋转的矩阵,使得点ps现在将在屏幕上显示为plnew,即 P * Mnew * ps = plnew
这显然是不受约束的,所以我需要找到正确的约束。约束基于这样的事实:我只能使用phi和theta进行旋转,如问题的介绍中所述。那我该怎么解决Mnew?或者换句话说是新闻和thetaNew。
顺便说一下,结果“效果”我想要的是,如果用户点击球体上的某个位置然后拖动球体,那么用户点击的点会在拖动过程中保持在鼠标下方并且球体保持直立。 / p>
答案 0 :(得分:0)
让psnew = inv(M)* inv(P)* pl
即。 psnew只是球体上plnew点的位置。
V = psnew-PS
so(theta,phi)= convertToPolarCoordinates(v)
转换是标准的,可以在维基百科或其他任何地方找到