This may be a really basic question but the typical atan2 method isn't working when I write it in a program.

I need a camera object to face a certain target in 3D space.
I need to calculate the 3 Euler angles (yaw, pitch, roll) for the camera.

alt text

How can I do this?

  • 1
    $\begingroup$ The solution will not be unique since you can always rotate the camera on its axis and still have it pointing at a target. Like choosing portrait vs. landscape in a real camera. $\endgroup$ – Jyotirmoy Bhattacharya Oct 13 '10 at 23:36
  • $\begingroup$ You're right, but at least the X and Y can be calculated to face the point, if not a proper Z (roll). $\endgroup$ – Robinicks Oct 14 '10 at 5:06
  • $\begingroup$ Can you explain exactly how your use of two-argument arctangent is failing? It seems to me that any correction to your algorithm would involve the addition or subtraction of some multiple of $\pi/2$. $\endgroup$ – J. M. is a poor mathematician Oct 20 '10 at 11:07

From looking at your diagram, it appears to me that the transformation takes the unit vector $(i_x,i_y,i_z)$ and rotates it to point to $(f_x,f_y,f_z)$:
$$\begin{pmatrix}c_\Psi&s_\Psi&0\\-s_\Psi&c_\Psi&0\\0&0&1\end{pmatrix} \begin{pmatrix}1&0&0\\0&c_\theta&-s_\theta\\0&s_\theta&c_\theta\end{pmatrix} \begin{pmatrix}c_\phi&-s_\phi&0\\s_\phi&c_\phi&0\\0&0&1\end{pmatrix} \begin{pmatrix}i_x\\i_y\\i_z\end{pmatrix} = \begin{pmatrix}f_x\\f_y\\f_z\end{pmatrix} $$
where $c_\phi = \cos(\phi), s_\phi = \sin(\phi)$, etc.

It isn't hard to solve for $\phi,\theta$ and $\Psi$ if you assume that your camera begins by pointing in a convenient direction such as $(i_x,i_y,i_z) = (0,0,1)$.

  • $\begingroup$ Uh, I should add that when writing these things out, I normally have (a) wrong signs and (b) wrong orders of matrix multiplication. $\endgroup$ – Carl Brannen Mar 23 '11 at 0:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.