Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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# 摄像机正在观察一个球杆包裹物_C#_Math_3d_Xna_Camera - Fatal编程技术网

C# 摄像机正在观察一个球杆包裹物

C# 摄像机正在观察一个球杆包裹物,c#,math,3d,xna,camera,C#,Math,3d,Xna,Camera,我有一个3D相机,它以球体表面上的一个点为中心。它完美地跟随并围绕它旋转,除了在球体的极点。请注意,球体实际上是投影到球体上的立方体,以便于管理位置坐标 如果对象围绕球体水平移动,相机将按预期工作。但是,如果对象朝向球体的顶极或底极移动,相机将环绕该极。如果它笔直穿过杆子,当它穿过杆子时,它看起来会转180度 我理解为什么会发生这种情况——必须有一个全局上方向向量,相机才能知道如何定位自己。如果我将其上方向向量更改为不同的方向,例如右方向,相机将不再围绕顶部或底部极点翻转,而是在球体的左侧和右侧

我有一个3D相机,它以球体表面上的一个点为中心。它完美地跟随并围绕它旋转,除了在球体的极点。请注意,球体实际上是投影到球体上的立方体,以便于管理位置坐标

如果对象围绕球体水平移动,相机将按预期工作。但是,如果对象朝向球体的顶极或底极移动,相机将环绕该极。如果它笔直穿过杆子,当它穿过杆子时,它看起来会转180度

我理解为什么会发生这种情况——必须有一个全局上方向向量,相机才能知道如何定位自己。如果我将其上方向向量更改为不同的方向,例如右方向,相机将不再围绕顶部或底部极点翻转,而是在球体的左侧和右侧极点上显示相同的行为

我的问题是如何改变我的相机的行为,这样就不会发生这种情况。我想要的是让我的相机感觉到相机处于一个恒定的位置,看着球体,球体在X轴和Z轴上旋转

我意识到这可能会导致“错误”的方向-例如,如果用户从球体的正面开始,向上,然后向左,他们将在球体的左侧结束,但相机在其Z轴上旋转90度,而如果他们从正面开始,直接移向左侧,则不会旋转。这很好,因为我可以检测相机何时穿过一张脸并缓慢地“固定”相机的局部旋转,或者允许用户解锁相机,他们可以自己处理相机的角度

作为参考,我的相机目前正在使用此问题的解决方案进行计算:


如有任何见解,将不胜感激

如果希望球体像轨迹球一样工作,请按照用户控件的指定对旋转矩阵应用增量旋转(例如,x轴和y轴)

在更新之后,您仍然需要“重新规范化”旋转矩阵——否则,数值错误将逐渐出现,并且您的旋转矩阵最终将不是旋转矩阵。计算应该是这样的:

update =  RotX(userInput.dX) * RotY(userInput.dY)
rawUpdatedRot = userRot * update
newZ = Normalize( Cross(rawUpdatedRot.x, rawUpdatedRot.y) )
newY = Normalize( Cross(newZ, rawUpdatedRot.x) )
newX = Normalize( rawUpdatedRot.x )
userRot = Matrix(newX, newY, newZ)

查看SketchUp的旋转模型。当你穿过两极时,它们会反转向上的方向。你是如何围绕球体旋转的?矩阵还是四元数?不幸的是,我不能这样做,因为摄影机、球体和球体上的对象必须在世界空间中。我链接的线程解释了我是如何设置的;我很抱歉没有说得更清楚。是的,你可以:你只需要找出在哪里应用旋转。基本上,您需要将摄影机设置为球体中心的父对象,并在那里应用旋转。(请注意,摄影机变换以相反的方式应用于对象父对象层次中矩阵堆栈的“另一端”。)