【问题标题】:Translation on a X,Z plane using variable axis relative to camera orientation使用相对于相机方向的可变轴在 X、Z 平面上平移
【发布时间】:2013-10-28 00:09:05
【问题描述】:

我在世界 X、Z 轴上有一块棋盘。 我有一个相机可以旋转向下或向上看,并使用世界 Y 轴从左向右旋转。

这是相机旋转代码:

float angle = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World);

angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(angle, 0.0f, 0.0f, Space.Self);

使用鼠标按钮和鼠标位置输入(拖放)我在世界上平移相机。它接收一个二维向量,其中包含鼠标(拖放)操作的 X 和 Y 值。这是我使用的方法的代码:

private void CameraOnPlaneTranslation(Vector2 myVector)
{

   float cameraYPos = Camera.main.transform.position.y;

   Camera.main.transform.Translate(new Vector3(myVector[0], 0.0f, myVector[1]));

   Camera.main.transform.position = new Vector3(Camera.main.transform.position.x, cameraYPos, Camera.main.transform.position.z);
}

问题:当我的相机没有直接朝向 Z 轴(0.0f,Z,0.0f)时,我计算的平移向量不正确。我需要改变向量的 Y 值,这样相机就不会在世界 Y 轴上移动。

谢谢

【问题讨论】:

  • 您的问题有一些模棱两可的地方,在您把问题弄得更清楚之前,您不太可能得到答复。通过“拖放”,您真的是指“在左键按下时鼠标移动”吗?在第二段中,当您说“我的问题是”时,您的意思是这是您的问题陈述(您希望它如何工作),还是“翻译长度改变但不应该”? Vector2 myVector 来自哪里?它是在 mouseMove eventHandler 中调用的吗?是否也是mouseMove屏幕DeltaX,DeltaY从其他屏幕点的减少?
  • 通过“拖放”,您真的是指“鼠标在左键按下时移动”吗? -> 是我的意思是相同的鼠标拖放移动不会翻译取决于相机方向的相同距离的相机。 它来自拖放方法,该方法返回鼠标在 x 和 y 轴上的距离。所以基本上我用这些值创建了一个新的向量 3 并用它来移动相机。
  • 谢谢。基于此,我认为我的回答适用。我希望 Translate 方法会为您更新相机位置值,因此请消除对 Camera.main.transform.position = 的调用
  • 一般来说,“拖放”一词用于将数据或文件引用从一个应用程序移动到另一个应用程序。这就是为什么你以这种方式在这里使用它需要我要求澄清。

标签: c# rotation unity3d translation axis


【解决方案1】:

我对 Unity 不熟悉,但假设它在这些方面与其他 3D 系统相似,我将尝试回答,希望不会让自己感到尴尬。

看起来你 /translate/ 相机位置,然后立即 /set/ 相机位置,从而覆盖了 translate 所做的工作。如果是这种情况,您应该尝试设置一次camera.main.transform.position(在创建相机后的行中)。然后仅通过 Translate 调用应用myVector(如您所愿)。因此你应该去掉Camera.main.transform.position = new Vector3(Camera.main.transform.position.x, cameraYPos, Camera.main.transform.position.z);方法的第三行

尝试此操作后,如果仍然没有达到您的预期,请查看是否需要您更新视图或 Flush 或 ApplyTransform 。 . .任何能让它理解的东西,你都已经完成了对变换的修改,你已经准备好用更新的变换再次处理它。

【讨论】:

  • 我需要在平移之前获取凸轮的 y 位置并将其重新定位到之前的值,这样相机就不会在世界 Y 值上移动。这就是 .transform.positon 的用法......当我重新定位我的相机时,我失去了一些平移向量长度。这意味着我实际使用的平移向量不正确,因为我希望它与板的 X、Z 平面平行。
  • 当你说“所以相机不会在世界 Y 值上移动”时,我很难理解你的意思。您是否打算将相机围绕距相机位置固定距离的点旋转一圈?如果你没有在一个圆圈中移动,并且你发送 transform.Y = 0.0f,那么是什么让相机在 Y 方向移动? (注意:我要到美国东部时间上午 8 点才能回复。)
  • 好的,我会重新制定。我有一个使用 X、Z 世界轴的 2D 板。我有一个可以向任何方向旋转的相机,只要它与电路板对齐 -> 浮动角度 = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod; ->Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World); ->angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod; ->Camera.main.transform.Rotate(角度, 0.0f, 0.0f, Space.Self);你有翻译代码。我希望这个澄清有所帮助
  • 我重新表述了主要问题主题,以便于阅读
  • 感谢您重新提出您的问题。我想我们已经达到了我能帮助你的极限。几个月前我在 WPF 中实现了类似的东西,这是一个挑战。但我从来不需要在相机上使用四元数。我没有在您的 cmets 中看到您是否尝试消除重置相机位置的最后一行代码。我将在今天剩余的时间里有空,但我只会在我认为我有对你有用的东西时才会回复。
【解决方案2】:

我已经通过添加另一个仅受相机右/左旋转(世界向上矢量)和相机平移影响的 GameObject 解决了这个问题。

在唤醒方法中

cameraOrientation = new GameObject("cameraOrientation");
cameraOrientation.transform.position = Camera.main.transform.position;
cameraOrientation.transform.localEulerAngles = new Vector3(0.0f, Camera.main.transform.localEulerAngles.y, 0.0f);

在旋转方式中

float angle = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World);
cameraOrientation.transform.Rotate(0.0f, angle, 0.0f, Space.World);

angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(angle, 0.0f, 0.0f, Space.Self);

最后是翻译方法

cameraOrientation.transform.Translate(new Vector3(myVector[0], 0.0f, myVector[1]));
Camera.main.transform.position = cameraOrientation.transform.position;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 2015-03-23
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多