【问题标题】:Rotate object to "look at" another object in 3 dimensions?旋转对象以“查看”另一个 3 维对象?
【发布时间】:2024-12-08 01:35:01
【问题描述】:

我想创建一个公式来旋转我的对象 (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:对象矩阵的位置在后期相乘,用于测试目的...

【问题讨论】:

  • 世界是否有一个向下而不是向上的正 y 轴,在这种情况下,objectUpVector 将为 {0.0, -1.0, 0.0 }
  • this没有回答这个问题吗?
  • @Merlin069 如果我这样做,茶壶会倒置,但会朝所需方向旋转。
  • @Surt 这个答案适用于视图矩阵,据我所知,它是倒置的......我不希望它被倒置。

标签: c++ math matrix 3d rotation


【解决方案1】:

我找到了我的问题的答案,事实证明我只需要像这样更改矩阵内值的顺序:

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
};

【讨论】:

  • 只需要添加用于 OpenGL 的按列矩阵(他们选择它是出于我不知道的一些性能原因)这是矩阵的按行表示
【解决方案2】:

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

  • 看这里:Transform matrix anatomy
  • 原点 = o1.position
  • Z 轴 = o1.position-o2.position
    • 并将其设为粗略单位长度
    • 我的平截头体/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 矩阵

【讨论】:

  • 您在这里谈论的是相机/视图矩阵,但这不是我想要实现的目标。我只是想旋转一个物体(茶壶/o1)以面向另一个物体(球体/o2)的方向
  • @ManIkWeet 在这种情况下忽略我的答案的最后 4 行