旋转对象以“查看”3维中的另一个对象?

时间:2014-09-24 12:54:29

标签: c++ math matrix 3d rotation

我想创建一个公式来旋转我的对象(o1)以始终指向另一个对象(o2)的方向,而不管o1的位置。

有点像下图中的相机: http://puu.sh/bLUWw/aaa653accf.png

到目前为止我得到了以下代码,但偏航轴似乎是倒置的:

Vector3 lookat = { lookAtPosition.x, lookAtPosition.y, lookAtPosition.z };
Vector3 pos = { position.x, position.y, position.z };
Vector3 objectUpVector = { 0.0f, 1.0f, 0.0f };

Vector3 zaxis = Vector3::normalize(lookat - pos);
Vector3 xaxis = Vector3::normalize(Vector3::cross(objectUpVector, zaxis));
Vector3 yaxis = Vector3::cross(zaxis, xaxis);

Matrix16 pm = {
    xaxis.x, yaxis.x, zaxis.x, 0,
    xaxis.y, yaxis.y, zaxis.y, 0,
    xaxis.z, yaxis.z, zaxis.z, 0,
    0, 0, 0, 1
};

见下图: http://puu.sh/bLUSG/5228bb2176.jpg

我确定这只是一些必须交换的变量,但我找不到它们......

PS:为了测试目的,对象矩阵的位置在稍后阶段成倍增加......

2 个答案:

答案 0 :(得分:2)

我找到了问题的答案,事实证明我只需改变矩阵内部值的顺序如下:

Matrix16 pm = {
    xaxis.x, xaxis.y, xaxis.z, 0,
    yaxis.x, yaxis.y, yaxis.z, 0,
    zaxis.x, zaxis.y, zaxis.z, 0,
    0, 0, 0, 1
};

答案 1 :(得分:1)

相机矩阵是表示其坐标系的变换矩阵的逆矩阵

  • 看这里:Transform matrix anatomy
  • origin = o1.position
  • Z轴= o1.position-o2.position
    • 并使其单位长度粗糙
    • mine frustrum / Zbuffer配置为在-Z轴方向查看
  • 现在只计算X,Y轴与彼此垂直,Z也通过交叉产品计算
    • 并使它们的单位长度为粗
    • 所以拿一些矢量(不平行于Z)
    • 理想情况下最适合像向上矢量(0,1,0);
    • 的东西
    • 将其乘以Z轴并将结果存储到X(或Y)
    • 然后再将其乘以Z轴并存储到Y(或X)。
  • 现在你有一个代表O1坐标系的变换矩阵M1
  • 如果您只想渲染对象,那就是
  • 如果你想在对象o1
  • 上设置相机
  • 然后只计算:
  • ViewMatrix=inverse(M1)*ProjectionMatrix;
  • 此处inverse matrix computation用于我的OpenGL矩阵