假设我有这个鸡模型,我想要经常看向观察者(相机位置),或者更容易看向原点(0,0,0)。 如何计算每个轴的角度,以便我可以用它们旋转对象?
修改
很抱歉,如果我的问题太笼统了。我仍然在努力解决这个问题。 让我们说模型空间中的3D模型位置是(x,y,z),我希望模型能够看到"看起来"朝向原点。 我的第一个想法是开始围绕x轴旋转(垂直旋转): 将黄色圆圈视为y平面。
所以我尝试了下面的代码,它根本不会旋转模型。
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轴方向看。 我做错了什么?
答案 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
保持在地平面上),你将需要一组不同的旋转和角度。所以要完全回答你需要提供更多信息。