【问题标题】:Incorrect results of simple coordinate transformation in UE4UE4中简单坐标变换结果不正确
【发布时间】:2019-05-22 02:00:08
【问题描述】:

我有一个简单的例子:

FVector TransformTest()
{
    FVector translation;
    {
        translation.X = 0.0f;
        translation.Y = 20.0f;
        translation.Z = 0.0f;
    }

    FRotator rotation;
    {
        rotation.Roll   = 0.0f;
        rotation.Pitch  = 0.0f;
        rotation.Yaw    = 45.0f;
    }
        
    FVector scale;
    {
        scale.X = 2.0f;
        scale.Y = 1.0f;
        scale.Z = 1.0f;
    }

    FTransform test_transform = FTransform(rotation, translation, scale);

    return (test_transform.Inverse() * test_transform).GetTranslation();
}

这个函数会返回向量:

[X = -10.0, Y = -10.0, Z = 0.0].

预期:

[X = 0.0,Y = 0.0,Z = 0.0].

我在做变换,比如LocalToWorld然后WorldToLocal,我从某个空间开始,必须回到这个空间 (有一些小错误),但我在远离源头的陌生空间完成了我的旅程。

我认为,我已向 Epic 提交了一个错误,并得到了回复:

你好,

感谢您提交错误报告,但目前我们认为您所描述的问题实际上并不是虚幻引擎的错误,因此我们无法对此采取任何进一步的措施。

Here is UE4 forum thread.

这种行为正确吗?

是否是错误?

【问题讨论】:

  • FTransform 不是矩阵,但它应该以相同的方式工作。这很奇怪。你可以尝试对 FMatrix 做同样的事情吗? :-)
  • @MichaelNastenko 我必须用С++编写一个辅助函数,将transform转换为FMatrix,处理它们,然后转换回transform。那是我通过任何排列得到正确结果的时候。
  • 那么这肯定是一个错误
  • 范围是什么?我提出了一项修改,但我删除了它,但被拒绝了。
  • @Lyngmo 我专门添加了它们以强制关注数字,而不是代码。很抱歉拒绝编辑。

标签: c++ graphics transform linear-algebra unreal-engine4


【解决方案1】:

实际上,它似乎无法解决(没有重大更改)。

FTransform 已分解变换(平移、旋转和缩放)。应用它按比例、旋转和平移顺序进行。

但是反向变换必须以相反的顺序应用 - 反向平移、旋转和缩放。

但是,它是同一个类,它没有任何关于应用程序顺序的信息。

它适用于统一的比例,但对于非统一的比例是不正确的。如果您使用非均匀,则必须使用 FMatrix。

【讨论】:

  • 这是一个重大错误。两天来,我试图在某个组件周围的非世界空间中构建一个边界框,但由于某种原因,bbox 的大小和位置不正确。我在这里。
  • 正如我所说 - 使用 FMatrix。而且我不确定我们是否可以称其为错误。这更像是一个设计决策。
  • 老实说,我不同意,这对于计算机图形开发人员来说非常不直观。正如我所说,我为此花了很多时间。而现在,显然,我必须自己实现边界框计算算法。
  • 这就是我们使用矩阵的原因。
  • 为什么您认为只有通过重大更改才能解决此问题?分解变量用受保护的访问修饰符隐藏,因此可以在不影响接口的情况下修改类实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
相关资源
最近更新 更多