【问题标题】:Aligning coordinate systems对齐坐标系
【发布时间】:2013-08-31 17:54:54
【问题描述】:

假设我有 2 个坐标系,如图所示

如何对齐这个坐标系?我知道我需要用 180 度平移 X 周围的第二个坐标系,然后将其转换到第一个坐标系的 (0, 0) ,但是这样做会得到错误的结果。将非常感谢任何详细的答案。

编辑:实际上第二个坐标系的 (0, 0) 与第一个坐标系的 Y 位于同一点。

【问题讨论】:

  • 在这种情况下,您真的只是移动 Y 的原点并翻转 Y 坐标吗?您应该能够乘以适当的平移矩阵和 Y 为 -1 的比例矩阵。旋转 180 度也会反转您的 X 坐标,并且根据图表判断,您只希望 Y 反转。或者,您可以旋转然后将 X 翻转回去;没有参考点可以显示您在两个图表中的起源是如何真正相关的。
  • @Andon M. Coleman 我需要将第二个坐标系的(0,0)“放置”到第一个坐标系的(0,0),并围绕 X 旋转 Y,所以结果只有第一个坐标系(以便第二个坐标系中的任何点都与第一个坐标系相同)。
  • 请注意,旋转无法解决此问题。实际上,这里有两个问题。您的 Y 坐标系正在改变方向,但 X (应该是)保持不变。如果旋转 180 度,则 (-Y,X) 处的点将在屏幕外。您需要使用 (-Y,-X)。

标签: c++ qt opengl transformation


【解决方案1】:

重要的信息是第二个坐标系的原点在哪里 - 即(a,b)

一旦你知道了,你所需要的就是:

QPointF pos1; // original position
QTransform t;
t.scale(1, -1);
t.translate(a, -b+1);
QPointF pos2 = pos1 * t;

【讨论】:

    【解决方案2】:

    您必须在以下位置找到正确的 a,b,c,d,Ox,Oy 值:

    X = a * x + b * y + Ox

    Y = c * x + d * y + Oy

    其中 x,y 是一个系统中该点的坐标,而 X,Y 是另一个系统中的坐标。

    在您的情况下,a = 1,b = 0,c = 0,d = -1。 Ox,Oy 是 Origins 之间的偏移量。

    https://en.wikipedia.org/wiki/Change_of_basis

    【讨论】:

    • 感谢您的回答,但我不确定它是否适合我。如果我清楚地理解,您编写的方程式实际上是旋转矩阵和平移矩阵(在本例中为向量)。其中 a=cos(180),b=-sin(180),c=sin(180),d=Cos(180)。但问题是,例如,当将此应用于 glwidget 时,在小部件中绘制的任何内容都在第一个坐标系中给出(尽管鼠标坐标在第二个坐标系中获得),如果我要跟踪鼠标位置,然后单击 (1,1 ) 的第一个坐标系,输出将不是 (1,1)。
    • 您错过了相似部分(每个轴都可能)。您的值是 a=d=-1 这是一个旋转。在我的例子中,y 轴是镜像的(没有旋转)。
    【解决方案3】:

    这是旋转 180 度的问题,它不仅会影响 Y 坐标的方向,还会影响 X。

    Y X | | v +--> X Y

    您可能打算做的是在 Y 处平移该点,然后反转您的 Y 坐标。你可以这样做:

    1. 将 Y 转换为新的原点
    2. 比例 (1, -1)
    Y +--> X ^ => | | v +--> X Y


    经过更多的思考,我不得不怀疑,你为什么要首先进行这种转变?是不是因为 OpenGL 坐标和 Qt 用于其窗口的坐标不同?

    如果是这种情况,您实际上可以更改您的投影矩阵...如果您使用的是正交矩阵,例如:

    试试glOrtho (0, X, 0, Y, -1, 1);,而不是传统的glOrtho (0, X, Y, 0, -1, 1);

    如果您选择这样做,您可能需要更改多边形“正面”的缠绕方向。 OpenGL 默认为 CCW,将其更改为 glFrontFace (GL_CW),这样可以防止奇怪的光照/剔除行为。

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 2020-05-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2019-07-03
      • 1970-01-01
      相关资源
      最近更新 更多