c++ - 使用 OpenGL 定位图形以查看相机

标签 c++ opengl matrix

在我的 opengl 应用程序中,我想调整图形的方向以注视相机,为此,我为所有对象定义了 2 个 vector ,正面和上方。

我使用 gluLookAt 来控制相机,所以我需要的 vector newFront 和 newUp 很容易知道。

我用来控制每个图形方向的代码是:

m4D orientate(v3D newFront, v3D newUp)
{
    double angle = angle_between(front, newFront);
    v3D cross = normalize(cross_product(front, newFront));

    m4D matrix = rotate_from_axis(angle, cross);

    up = normalize(up * matrix);

    angle = angle_between(up, newUp);
    cross = normalize(cross_product(up, newUp));

    return(rotate_from_axis(angle, cross) * matrix);
}

当矩阵堆栈只有这个矩阵时,这段代码运行良好,但如果我插入前一个矩阵旋转(当然是旋转前面和向上的 vector ),它就会失败。

我有什么错?

最佳答案

为什么总是那些复杂的“我求解反向旋转并将其乘以模型 View ”广告牌/冒名顶替解决方案,而有更简单的方法?

设 M 是要从中确定广告牌矩阵的模型 View 矩阵。矩阵是 4×4 实值类型。左上角的 3×3 定义了旋转和缩放。对于广告牌,这部分是标识。

因此,通过将当前模型 View 矩阵的左上部分替换为标识,并保持其余部分不变,即

 1  0  0 tx
 0  1  0 ty
 0  0  1 tz
wx wy wz ww

并使用该矩阵进行进一步的转换,您将获得所需的效果。如果应用了缩放,请将左上角的标识替换为缩放矩阵。

关于c++ - 使用 OpenGL 定位图形以查看相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12910332/

相关文章:

c++ - 你在 Vim 中调试 C++ 代码吗?如何?

c# - 如何将两个非托管 C++ 函数包装到两个托管 C# 函数中?

opengl - 使用 OpenGL 和顶点数组对象渲染两个对象

c++ - 捕获在不同线程中运行的方法的异常的正确方法是什么?

c++ - 四元数表示或示例?

c++ - 不断向 glBufferData 添加新点的最佳方法是什么?

C - 应用于矩阵的函数指针。段错误

Python——计算共现矩阵

python - 4D numpy 数组上的矩阵乘法

没有 typedef 的模板类的 C++ 模板,这可能吗?