C# XNA摄像机绕Z轴旋转
我正在为3D游戏制作一个摄像头。摄像机由以下变量组成:C# XNA摄像机绕Z轴旋转,c#,xna,C#,Xna,我正在为3D游戏制作一个摄像头。摄像机由以下变量组成: static Vector3 cameraLookAt = new Vector3(0, 0, 0); static Vector3 cameraPosition; static float cameraZoom = 25; // Field of view const int cameraZoomNear = 3; // The furthest the camera can zoom in const int cameraZoomF
static Vector3 cameraLookAt = new Vector3(0, 0, 0);
static Vector3 cameraPosition;
static float cameraZoom = 25; // Field of view
const int cameraZoomNear = 3; // The furthest the camera can zoom in
const int cameraZoomFar = 45; // The furthest the camera can zoom out
static float cameraPitch; // Amount to change the pitch
static float cameraRotation; // Amount to change the rotation
默认情况下,“cameraLookAt”位于(0,0,0)且“cameraPosition”位于(0,0,10)这意味着相机位于“cameraLookAt”位置正上方,可以鸟瞰下方的对象(红绿蓝xyz平面测试对象)
“cameraLookAt”可以沿x轴和y轴移动,然后相对于“cameraLookAt”位置以及“CameraPicch”和“cameraRotation”的当前值计算“cameraLookAt”
当前,您可以围绕x/y轴精细移动,并更改摄影机的俯仰,使其从鸟瞰视图变为地面视图。我遇到的麻烦是让摄像机旋转正常
当旋转值改变时,仅当节距改变时才有任何效果-从程序启动时的默认值(直接向下看“cameraLookAt”)
当该值发生更改时,您可以绕Z轴旋转,但视图也会滚动,因此,当您旋转180度时,相机也会滚动180度,并且您的视图是颠倒的
下面是计算“cameraPosition”位置的代码,我确信这些行中的固定行
cameraPosition = cameraLookAt + new Vector3(0, 0, 10);
Vector3 temp = Vector3.Normalize(cameraPosition - cameraLookAt); //creates a unit length vector that points in the direction from 'lookAt' to 'position'
cameraPosition = Vector3.Transform(cameraPosition - cameraLookAt, Matrix.CreateRotationX(cameraPitch)) + cameraLookAt;
cameraPosition = Vector3.Transform(cameraPosition - cameraLookAt, Matrix.CreateRotationZ(cameraRotation)) + cameraLookAt;
view = Matrix.CreateLookAt(cameraPosition, cameraLookAt, new Vector3(0.0f, 1.0f, 0.0f));
projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(cameraZoom), graphics.GraphicsDevice.Viewport.AspectRatio, nearClip, farClip);
此外,我还发现了一个问答,可以帮助我首先对其进行编码偏移量应在不改变其长度的情况下旋转,然后添加到相机位置 我认为应该是这样的:
offset = new Vector3(0, 0, 10);
Vector3 rotatedOffset = Vector3.Transform( offset,
Matrix.CreateRotationX(cameraPitch)
* Matrix.CreateRotationZ(cameraRotation));
cameraPosition = cameraLookAt + rotatedOffset;
偏移应在不改变其长度的情况下旋转,然后添加到相机位置 我认为应该是这样的:
offset = new Vector3(0, 0, 10);
Vector3 rotatedOffset = Vector3.Transform( offset,
Matrix.CreateRotationX(cameraPitch)
* Matrix.CreateRotationZ(cameraRotation));
cameraPosition = cameraLookAt + rotatedOffset;
谢谢你的帮助,但它并没有真正解决问题,最后我得到了一些帮助,他使用了不同的方法,而不是试图修复我的代码,但它确实产生了一些问题本身。。。仍然在研究最终的解决方案。谢谢你的帮助,但它并没有真正解决问题,最后我得到了一些帮助,他使用了不同的方法,而不是试图修复我的代码,但它确实产生了一些自己的问题。。。仍在研究最终解决方案。