【问题标题】:2D transformation, c++, rotate/translate/Scale/centering2D 变换,c++,旋转/平移/缩放/居中
【发布时间】:2016-05-18 20:55:18
【问题描述】:

我的代码用于翻译,唯一的问题是我似乎无法将其居中。 我试过做 “translate = translate * center” 并且它看起来像移动到右上角。我不确定我还能做什么。我知道我的矩阵函数工作正常,我在这里缺少什么?

oid viewContext::calculate() {
std::cout << "calculate" << std::endl;

/*
 * reinitialize these values
 */
translated.clear();
translated[0][0] = 1;
translated[1][1] = 1;
translated[2][2] = 1;

//translated = translated * center;
//if translate is called
if (whichMethod == trans) {
    translated = translated * center;
    translated = translated * S;
    translated = translated * T;
}

上面代码中的 if 语句是我正在尝试的,我知道它是不必要的。

matrix viewContext::model_to_device(const matrix& param) {

    std::cout << "model to device" << std::endl;

    //matrix hold_values = param;

    matrix hold_values = translated * param;

    return hold_values;

}

我的翻译、旋转等方法如下所示。好吧是以这种方式格式化的,他们在最后调用calculate()

void viewContext::rotator(double degree) {
std::cout << "Rotate" << std::endl;

double theta = ((degree * M_PI) / 180);
R[0][0] = cos(theta);
R[0][1] = -1 * sin(theta);
R[1][0] = sin(theta);
R[1][1] = cos(theta);
calculate();

}

    viewContext::viewContext() :
        translated(3, 3), inverted(3, 3), center(3, 3), T(3, 3), S(3, 3), R(3,
                3) {
    //clear matrix just incase it isn't empty
    //Should be empty but this is precautionary
    translated.clear();

    inverted.clear();

    /*
     * Constant values
     * echelon form
     */
    T[0][0] = 1;
    T[1][1] = 1;
    T[2][2] = 1;

    /*
     * Constant values
     * 300 = x, 400 = y to put at origin.
     */
    center[0][0] = 1;
    center[0][2] = width;
    center[1][1] = -1;
    center[1][2] = height;
    center[2][2] = 1;

    /*
     * Constant values
     * Echelon form
     */
    S[0][0] = 1;
    S[1][1] = 1;
    S[2][2] = 1;

    //TODO
//  /*
//   * Constant values
//   * Echelon form
//   */
    translated[0][0] = 1;
    translated[1][1] = 1;
    translated[2][2] = 1;

    /*
     * Constant values
     * Echelon form
     */
    R[0][0] = 1;
    R[0][1] = 0;
    R[1][0] = 0;
    R[1][1] = 1;
    R[2][2] = 1;

    calculate();
}

这是我的构造函数的一部分,实现了中心。

    private:

    /* translation matrix */
    matrix translated;

    /* translation inverse matrix */
    matrix inverted;

    /* to center the image */
    matrix center;

    matrix T;
    matrix S;
    matrix R;

    const int height = 300;
    const int width = 400;
    void calculate();

    int whichMethod;
};

案例(KEY_U): std::cout 清除(); 派生->绘制(gc, &vContext); 休息;

我不确定我做错了什么。 我使用键盘进行翻译(向上、向下箭头键等等。左右) 这很好用,但由于我已经实现了中心部分,它会移动到右上角,然后开始翻译。我不完全确定出了什么问题。 任何帮助将不胜感激!

【问题讨论】:

  • 您的问题并没有真正提供有关您在做什么的大量信息,但它看起来像是齐次坐标中平移和旋转的矩阵表示。你在哪里使用它们以及如何使用它们? OpenGL?请记住,使用矩阵时顺序很重要,所以 translated = center * S * T 先应用 T,然后是 S,然后再计算中心,如果你稍后计算 translated * coordinateVector
  • @Anedar 对不起我的其他帖子,有些人写道我提供了太多信息。我在基于 linux 的虚拟机上。 center 是我的矩阵,其中包含您在代码中看到的内容。 T 包含转换后的坐标。 S 包括缩放坐标。我应该把这些代码部分也放在这里吗?但是,是的,我首先居中,然后缩放,然后翻译。我认为这是实施它的正确方法。有什么我想念的吗?
  • 根据您发布的代码,centerRtranslated 是矩阵。但什么是 S 和 T?你希望model_to_device() 做什么?您应该提供与您的问题相关的所有信息 - 并且只提供相关信息。
  • @Anedar 每个具体的Shape都会使用ViewContext对象的变换方法将其局部模型坐标转换为设备坐标。 S 和 T 也是矩阵,它显示在靠近底部的代码部分。
  • @Anedar 我回复了你的回答,我相信你可能是对的,我绝对可以仔细检查。

标签: c++ graphics 2d computer-science transformation


【解决方案1】:

我假设您的矩阵乘法已正确实现,然后您的翻译矩阵构建为

translated = 1 * center * S * T

其中 1 是您的初始身份矩阵。

我从您的 cmets 进一步假设 model_to_device() 中的 param 是一个坐标向量,导致

hold_values = translated * param
hold_values = center * S * T * param

如您所见,应用于 param 的第一个运算符实际上是 T,然后是 S,然后是 center。因此,首先您平移坐标,然后缩放它们(缩放中心位于 (0,0) ),然后使用您的中心矩阵将它们平移(宽度,高度)并反转 y。所以基本上你先平移,然后缩放,然后居中。

【讨论】:

  • translated 被初始化为几乎在 rref 中,对角线上为 1。但我想我明白你的意思,所以我真的应该在我的计算()部分翻译 = T * S * center 吗?所以我的数学几乎是倒着做的?
  • 从我所说的翻译 = 翻译 * 中心;翻译 = 翻译 * S;翻译=翻译* T;所以这是否意味着我先与中心相乘,然后是 S,然后是 T?反之亦然
  • 您是按此顺序乘以矩阵,是的,但您总是从左侧乘以另一个矩阵,从右侧乘以另一个矩阵。并且矩阵乘法不是可交换的。见en.wikipedia.org/wiki/Matrix_multiplication
  • 我正在尝试你所说的,老实说,几乎在所有可能的情况下它都可能出现,但它不起作用。
  • 从仅平移开始,然后仅旋转,然后两者都进行,一次为 R * T,一次为 T * R。仔细查看转换的应用方式和顺序,特别是在旋转中心的地方。这应该有助于理解如何应用转换。如果您有新的转换,请先对其进行测试,然后依次添加其他转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2013-02-14
  • 1970-01-01
相关资源
最近更新 更多