如何转换这些 3D 相机三角方程以在新轴上工作
How do I convert these 3D camera trig equations to work on a new axis
以下函数计算我的 FPS 相机的目标向量以放入 OpenGL LookAt 方法中。相机方向(以弧度为单位)(0,0,0) 表示相机平行于负方向的 z 轴,相机右向量平行于正方向的 x 轴。
static Matrix4 GetViewMatrix()
{
Vector3 cameraup = Vector3.Transform(Vector3.UnitY,(Quaternion.FromAxisAngle(LineOfSightVector, Orientation.Z)));
LineOfSightVector.X = (float)(Math.Sin((float)Orientation.X) * Math.Cos((float)Orientation.Y));
LineOfSightVector.Y = (float)Math.Sin((float)Orientation.Y);
LineOfSightVector.Z = (float)(Math.Cos((float)Orientation.X) * Math.Cos((float)Orientation.Y));
return Matrix4.LookAt(Position, Position + LineOfSightVector, cameraup) * View; //View = createperspectivefield of view matrix4
}
相机y轴为(0,1,0)时效果很好。但是,我在我的相机方向(滚动)中引入了 Z 值。我用它来获取 "cameraup" 向量。我现在需要调整 LineOfSightVector 的 3 个三角方程,以考虑 "up" 向量的变化,以便相机控件朝正确的方向移动。有人可以就此给我一些建议吗?
谢谢
有
lineOfSight = vec3(sin(phi)*cos(ksi), sin(ksi), cos(phi)*cos(ksi));
您可以按如下方式计算向右和向上的方向:
right = vec3(cos(phi)*cos(ksi), 0, -sin(phi)*cos(ksi));
up = cross(lineOfSight, right);
up = normalize(up);
请注意,在此类模型中 cos(ksi) == 0 的情况应单独处理。
以下函数计算我的 FPS 相机的目标向量以放入 OpenGL LookAt 方法中。相机方向(以弧度为单位)(0,0,0) 表示相机平行于负方向的 z 轴,相机右向量平行于正方向的 x 轴。
static Matrix4 GetViewMatrix()
{
Vector3 cameraup = Vector3.Transform(Vector3.UnitY,(Quaternion.FromAxisAngle(LineOfSightVector, Orientation.Z)));
LineOfSightVector.X = (float)(Math.Sin((float)Orientation.X) * Math.Cos((float)Orientation.Y));
LineOfSightVector.Y = (float)Math.Sin((float)Orientation.Y);
LineOfSightVector.Z = (float)(Math.Cos((float)Orientation.X) * Math.Cos((float)Orientation.Y));
return Matrix4.LookAt(Position, Position + LineOfSightVector, cameraup) * View; //View = createperspectivefield of view matrix4
}
相机y轴为(0,1,0)时效果很好。但是,我在我的相机方向(滚动)中引入了 Z 值。我用它来获取 "cameraup" 向量。我现在需要调整 LineOfSightVector 的 3 个三角方程,以考虑 "up" 向量的变化,以便相机控件朝正确的方向移动。有人可以就此给我一些建议吗?
谢谢
有
lineOfSight = vec3(sin(phi)*cos(ksi), sin(ksi), cos(phi)*cos(ksi));
您可以按如下方式计算向右和向上的方向:
right = vec3(cos(phi)*cos(ksi), 0, -sin(phi)*cos(ksi));
up = cross(lineOfSight, right);
up = normalize(up);
请注意,在此类模型中 cos(ksi) == 0 的情况应单独处理。