3D旋转角度的方向?

时间:2014-12-15 17:33:19

标签: opengl math 3d vector-graphics

假设我有这个鸡模型,我想要经常看向观察者(相机位置),或者更容易看向原点(0,0,0)。 如何计算每个轴的角度,以便我可以用它们旋转对象?

修改

很抱歉,如果我的问题太笼统了。我仍然在努力解决这个问题。 让我们说模型空间中的3D模型位置是(x,y,z),我希望模型能够看到"看起来"朝向原点。 我的第一个想法是开始围绕x轴旋转(垂直旋转): 将黄色圆圈视为y平面。

image

所以我尝试了下面的代码,它根本不会旋转模型。

glm::vec3 camPos = camera.GetPosition();
float value = camPos.y / glm::sqrt(glm::pow(camPos.x,2.0f) + glm::pow(camPos.y, 2.0f) + glm::pow(camPos.z, 2.0f));
float angle = glm::asin(value);
cow.SetModelMatrix(glm::translate(camPos - glm::vec3(0,0,1.5)) * //then translate so the cow will appear a little bit infront of the camera
                   glm::rotate(glm::radians(angle), glm::vec3(-1,0,0)) *//then rotate vertically by the angle
                   glm::scale(glm::vec3(0.1, 0.1, 0.1)) //first scale, cause the cow (i mean chicken) is too big
                   ); 

相机从位置(0,0,5)开始,朝负z轴方向看。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

如果鸡位于原点c=(0,0,0)且相机位于r=(x,y,z)且地面位于y=0。然后你想要的是一系列旋转,让鸡的本地x轴指向相机。

首先将x轴定向在平面上,使其绕垂直y轴旋转,角度为φ=-ATAN(z/x),然后围绕z轴旋转一个角度ψ=ATAN(y/√(x^2+z^2))

这会创建一个3×3旋转矩阵E = ROT_Y(φ)*ROT_Z(ψ)

    | x/d  -x*y/(d*√(x^2+z^2)) -z/√(x^2+z^2) |
E = | y/d    √(x^2+z^2)/d            0       |
    | z/d  -y*z/(d*√(x^2+z^2))  x/√(x^2+z^2) |

其中d=√(x^2+y^2+z^2)。您会看到本地x轴(E的第一列)指向(x,y,z)。此外,本地z轴在垂直方向上没有组件,因此它始终位于地平面上。

但这取决于实施,就像你需要保持鸡y垂直(而不是将z保持在地平面上),你将需要一组不同的旋转和角度。所以要完全回答你需要提供更多信息。