【问题标题】:C++ 3D Scene distorts when looking up or down向上或向下看时 C++ 3D 场景扭曲
【发布时间】:2021-01-20 04:47:09
【问题描述】:

我有一个与this problem 相同的问题,但是提供的解决方案不能解决我的问题。

我正在使用来自 javidx9 的 PixelGameEngine 进行开发,所以我自己实现了所有这些功能。

这是 LookAt 函数的代码:

static Matrix4 LookAtMatrix(const Vector3& pos, const Vector3& target) {
        if(pos == target) { return LookAtMatrix(pos, target + Vector3(.01f, 0, 0)); }

        //get new forward direction
        Vector3 newFor = (target - pos).normalized();

        //get right direction
        Vector3 newRight; 
        if(newFor == Vector3::UP || newFor == Vector3::DOWN) { 
            newRight = Vector3::RIGHT; 
        } else {
            newRight = (Vector3::UP.cross(newFor)).normalized(); 
        }

        //get up direction
        Vector3 newUp = newRight.cross(newFor); 

        //make look-at matrix
        return Matrix4(
            newRight.x, newRight.y, newRight.z, 0,
            newUp.x,    newUp.y,    newUp.z,    0,
            newFor.x,   newFor.y,   newFor.z,   0,
            pos.x,      pos.y,      pos.z,      1
        );
    }

您可能会注意到,与其他实现相比,我的一些交叉产品是翻转的,但它可以很好地移动相机。

这是变形的 gif:

我不明白出了什么问题,我和我一起研究这个问题的朋友花了好几个星期都没有找到解决办法。我不知道还有什么可能导致问题。

我们的渲染过程的快速运行,以防出现问题

//project points to camera space
//clip triangles against view plane
//project triangles to screenspace
//clip triangles against camera's view fulcrum
//draw triangles

如果需要更多详细信息,我很乐意提供。谢谢。

【问题讨论】:

  • 在look-at中,只会出现平移和旋转。这是什么,你可以简单地检查你的矩阵(用于调试)。因此,行向量 0、1 和 2 必须彼此垂直。如果没有,你会得到可能解释失真的剪切。 (此外,它们的长度必须为 1。如果不是,您可以缩放。)虽然,我不能 100% 确定我在您的 GIF 动画中看到了什么(失真)。透视投影(带有不幸的配置)也可能导致此类或类似的效果。我只会相信这些数字... ;-)
  • @Scheff 当您说行向量 0、1 和 2 必须相互垂直时,您的意思是它们必须是正交的,对吗?我的朋友也看过很多透视投影,但我还没有看过。我将检查 lookAt 矩阵是否也没有尝试以某种方式进行缩放。谢谢。

标签: c++ matrix 3d


【解决方案1】:

解决方案太小了,花了好几周的时间。我们所要做的就是翻转 newUp 向量上的 y 轴,因为我们的 y 轴被翻转了,或者其他什么。我不确定。

【讨论】:

  • 翻转一个轴会导致左手坐标系(之前是右手坐标系)。我有点惊讶这是你的实际问题。但是,很好,你可以修复它。有了一点经验,“阅读”矩阵并不难。在我获得这种体验之前,当我的教授看了我一眼后告诉我“哦,旋转矩阵……”时,我感到惊讶和印象深刻。另一方面,他是数学博士... :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多