【发布时间】: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 矩阵是否也没有尝试以某种方式进行缩放。谢谢。