How to get Yaw, Pitch and Roll from a 3D vector

前端 未结 4 1875
别跟我提以往
别跟我提以往 2020-12-14 09:15

I have a direction vector that applied to a position gives me the point at which the camera should look. How can I get from that yaw, pitch and roll in order to use glRotate

相关标签:
4条回答
  • 2020-12-14 10:00

    pheelicks's equations are wrong. Dear future googlers, here you got what's working:

    Assuming pitch: rotation by X axis, yaw: rotation by Y axis, roll: rotation by Z axis. Direction vector V(x,y,z)

    pitch = asin(V.y / length(V));
    yaw = asin( V.x / (cos(pitch)*length(V)) ); //Beware cos(pitch)==0, catch this exception!
    roll = 0;
    
    0 讨论(0)
  • 2020-12-14 10:11

    You probably don't actually want the yaw, pitch and roll. You just need the correct transformation. Try using gluLookAt to build it. Documentation.

    0 讨论(0)
  • 2020-12-14 10:20

    None of these equations are 'wrong' but all are a little clumsy. Ryder052, you example does not account certain cases as you've commented. Why not use atan2?

    Given unit (normalized) direction vector d

    pitch = asin(-d.Y);
    yaw = atan2(d.X, d.Z)
    
    0 讨论(0)
  • 2020-12-14 10:20

    You cannot get yaw, pitch and roll from a direction vector as the direction vector will only tell which direction to look in (yaw and pitch)

    To get the yaw and pitch you use trigonometry - I assume you have some working knowledge. Check out this wiki page for some useful diagrams to visualize the angles.

    Letting Y = yaw, P = pitch.

    First to get yaw you want:

    tan(Y) = x/(-y)
    

    Now to get pitch:

    tan(P) = sqrt(x^2 + y^2)/z
    

    To get the actual values for Y and P you'll need to use inverse tan, I've written it above using tan to make the derivation clearer.

    Note that the minus signs depend on how you define you angles and axes, but you should get the idea.

    You can then set roll to be 0 or whatever you like.

    0 讨论(0)
提交回复
热议问题