在 OpenGL 中将笛卡尔世界坐标转换为球面局部坐标
Convert cartesian world coordinates to spherical local coordinates in OpenGL
我的问题如下:我想在一个点A的坐标系中得到一个点B的球面坐标。我可以访问点 A 的笛卡尔世界坐标,点 B 的笛卡尔世界坐标,以及描述旋转的四元数关于世界参考系的 A 点(所谓的 "orientation quaternion" 或 "attitude quaternion")。
到目前为止,这是我使用的代码类型(在 OpenGL 数学库中,glm):
#define U glm::dvec3(1.0, 0.0, 0.0)
#define V glm::dvec3(0.0, 1.0, 0.0)
#define W glm::dvec3(0.0, 0.0, 1.0)
glm::dvec3 cart_to_local(glm::dvec3 B_position) {
glm::dvec3 e1 = A_rotation_quaternion * U;
glm::dvec3 e2 = A_rotation_quaternion * V;
glm::dvec3 e3 = A_rotation_quaternion * W;
glm::mat3 transition_matrix(e1.x, e1.y, e1.z, e2.x, e2.y, e2.z, e3.x, e3.y, e3.z);
glm::mat3 reverse_transition_matrix = glm::inverse(transition_matrix);
glm::dvec3 v = B_position - A_position;
return reverse_transition_matrix * v;
}
然后我使用众所周知的公式(包括 acos、atan2 等)将笛卡尔坐标转换为球坐标。
它有效,但对我来说似乎涉及的步骤太多。有没有办法通过使用更多我不知道的标准函数来制作此代码 "smaller"?
我还没有测试过,但你应该可以做到:
glm::dvec3 cart_to_local(glm::dvec3 B_position) {
glm::dvec3 v = B_position - A_position;
return glm::inverse(A_rotation_quaternion) * v;
}
我的问题如下:我想在一个点A的坐标系中得到一个点B的球面坐标。我可以访问点 A 的笛卡尔世界坐标,点 B 的笛卡尔世界坐标,以及描述旋转的四元数关于世界参考系的 A 点(所谓的 "orientation quaternion" 或 "attitude quaternion")。
到目前为止,这是我使用的代码类型(在 OpenGL 数学库中,glm):
#define U glm::dvec3(1.0, 0.0, 0.0)
#define V glm::dvec3(0.0, 1.0, 0.0)
#define W glm::dvec3(0.0, 0.0, 1.0)
glm::dvec3 cart_to_local(glm::dvec3 B_position) {
glm::dvec3 e1 = A_rotation_quaternion * U;
glm::dvec3 e2 = A_rotation_quaternion * V;
glm::dvec3 e3 = A_rotation_quaternion * W;
glm::mat3 transition_matrix(e1.x, e1.y, e1.z, e2.x, e2.y, e2.z, e3.x, e3.y, e3.z);
glm::mat3 reverse_transition_matrix = glm::inverse(transition_matrix);
glm::dvec3 v = B_position - A_position;
return reverse_transition_matrix * v;
}
然后我使用众所周知的公式(包括 acos、atan2 等)将笛卡尔坐标转换为球坐标。
它有效,但对我来说似乎涉及的步骤太多。有没有办法通过使用更多我不知道的标准函数来制作此代码 "smaller"?
我还没有测试过,但你应该可以做到:
glm::dvec3 cart_to_local(glm::dvec3 B_position) {
glm::dvec3 v = B_position - A_position;
return glm::inverse(A_rotation_quaternion) * v;
}