3
\$\begingroup\$

Lets say I know what is directly above a turret. I also know where the turrets gun is currently pointing. I would like to know where will the turret's gun will point if I rotate it.

I suppose I could multiply \$A \cdot B\$, project \$A\$ on the plane \$B\$ is a normal of and then do the rotation in 2D and add back \$A \cdot B\$ but I am sure the math should be simpler than that?

enter image description here

\$\endgroup\$
1
\$\begingroup\$

You want to reflect \$\vec A\$ across \$\vec B\$. This has a simple formula, if \$\vec B\$ has length 1:

$$-\vec A + 2( \vec A \cdot \vec B)\vec B$$

What we've done here is to reverse \$\vec A\$ first, which means we negated both the component of \$\vec A\$ that's parallel to \$\vec B\$ and the component of \$\vec A\$ perpendicular to \$\vec B\$. Then we added twice the parallel component, \$-1 + 2 = +1\$, bringing it back to its previous value. So the net effect is that the part of \$\vec A\$ that was parallel to \$\vec B\$ remains unchanged, and only the perpendicular part gets reflected.

\$\endgroup\$
1
  • \$\begingroup\$ It looks like this answer assumes the question is asking about 2D, but by my reading it's asking about 3D, and wants to rotate the turret of a 3D tank some angle about its turret rotation axis - not reflect the turret across that axis. \$\endgroup\$
    – DMGregory
    Nov 10 '20 at 17:16
1
\$\begingroup\$

You simply want to apply the rotation matrix.

Assuming you use a cartesian metric for your game, and your gun is pointing in direction \$ \vec{A} = (x,y,z) \$, and you rotate around the vertical axis \$ \vec{B} = (0, 0, 1) \$. Then the rotation \$ R_z \$ by and angle \$ \theta \$ is defined as $$ R_z(\theta) = \left(\begin{array}{ccc}\cos \theta, & -\sin \theta,& 0\\\sin\theta, &\cos \theta,& 0\\0,&0,&0 \end{array}\right) $$

Thus the rotated vector \$\vec{A}^\prime = \vec{A} \cdot R_z = (x\cos\theta-y\sin\theta, x\sin\theta + y\cos\theta, 0)\$

For a more elaborate treatise around general axis, consult a book on algebra or have a look on the wikipedia article on rotation:

The matrix of a proper rotation \$R\$ by angle \$\theta\$ around the axis \$\vec u =(u_{x},u_{y},u_{z})\$, a unit vector with \$u_{x}^{2}+u_{y}^{2}+u_{z}^{2}=1\$, is given by:[3]

$$\small {R = \begin{bmatrix}\cos \theta +u_{x}^{2}\left(1-\cos \theta \right)&u_{x}u_{y}\left(1-\cos \theta \right)-u_{z}\sin \theta &u_{x}u_{z}\left(1-\cos \theta \right)+u_{y}\sin \theta \\u_{y}u_{x}\left(1-\cos \theta \right)+u_{z}\sin \theta &\cos \theta +u_{y}^{2}\left(1-\cos \theta \right)&u_{y}u_{z}\left(1-\cos \theta \right)-u_{x}\sin \theta \\u_{z}u_{x}\left(1-\cos \theta \right)-u_{y}\sin \theta &u_{z}u_{y}\left(1-\cos \theta \right)+u_{x}\sin \theta &\cos \theta +u_{z}^{2}\left(1-\cos \theta \right)\end{bmatrix}}$$

\$\endgroup\$

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.