Finding the angles for the X, Y and Z axis in 3D - OpenGL/C++

匿名 (未验证) 提交于 2019-12-03 03:08:02

问题:

I am currently trying to use OpenGL (With SDL) to draw a cube to the location where I left click in the screen and then get it to point at the position in the screen where I right click.

I can successfully draw a cube at my desired location using gluUnproject - Meaning I already know the coordinates of which my cube is situated.

However I do not know how to calculate all of the angles required to make my cube point at the new location.

Of course I am still using gluUnproject to find the coordinates of my right click, but I only know how to rotate around the Z axis from using 2D graphics.

For example before, if I wanted to rotate a quad around the Z axis (Of course, this would be a top down view where the Z axis is still "going through" the screen) in 2D I would do something like:

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

My question is, how would I go about doing this in 3D?

  • Do I need to calculate the angles for each axis as I did above?
  • If so how do I calculate the angle for rotation around the X and Y axis?
  • If not, what method should I use to achieve my desired results?

Any help is greatly appreciated.

回答1:

If your cube is at A = (x0,y0,z0)

If your cube is currently looking at B=(x1,y1,z1)

and if you want it to look at C=(x2,y2,z2) then;

let v1 be the vector from A to B

v1 = B - A

and v2 be the one from A to C

v2 = C - A

First normalize them.

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

then calculate the rotation angle and the rotation axis as

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

You can call glRotate with

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!