Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA摄像机绕Z轴旋转_C#_Xna - Fatal编程技术网

C# XNA摄像机绕Z轴旋转

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

我正在为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 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;

谢谢你的帮助,但它并没有真正解决问题,最后我得到了一些帮助,他使用了不同的方法,而不是试图修复我的代码,但它确实产生了一些问题本身。。。仍然在研究最终的解决方案。谢谢你的帮助,但它并没有真正解决问题,最后我得到了一些帮助,他使用了不同的方法,而不是试图修复我的代码,但它确实产生了一些自己的问题。。。仍在研究最终解决方案。