在我的 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/