gpt4 book ai didi

java - 无法正确旋转 3D 点 A 到 B(在 X、Y、Z 轴上)

转载 作者:行者123 更新时间:2023-11-30 06:46:17 25 4
gpt4 key购买 nike

我已经不知疲倦地研究了三个星期,将 3D 点“A”旋转到 3D 点“B”的每一个程序,以下是我尝试但没有成功的技术:

  • 旋转矩阵
  • 欧拉角到旋转矩阵
  • 轴角与旋转矩阵
  • 四元数坐标旋转
  • 三角多轴旋转

我想在java中执行同步3d 3轴(所以,X,Y,Z)旋转(请知道我并不特别理解它背后的数学,我更喜欢用java代码给出答案,以我显示的示例为例)。

e.g. 
Pointf a = new Pointf(0f, 2f, 0f);
Pointf b = new Pointf(2f, 0f, 2f);

// ~~~ Start of Rotation Matrix ~~~

// azimuth (Z Axis)
float azimuth = (float) Math.toRadians(90f);
// elevation (Y Axis)
float elevation = (float) Math.toRadians(0f);
// tilt (X Axis)
float tilt = (float) Math.toRadians(90f);

/*
public static Matrix4x4f createRotationMatrix(double azimuth, double elevation, double tilt) {
// Assuming the angles are in radians.
//Precompute sines and cosines of Euler angles
double su = sin(tilt);
double cu = cos(tilt);
double sv = sin(elevation);
double cv = cos(elevation);
double sw = sin(azimuth);
double cw = cos(azimuth);

//Create and populate RotationMatrix
Matrix4x4f A = Matrix4x4f.create();
A.values[0] = (float) (cv*cw);
A.values[1] = (float) ((su*sv*cw) - (cu*sw));
A.values[2] = (float) ((su*sw) + (cu*sv*cw));
A.values[4] = (float) (cv*sw);
A.values[5] = (float) ((cu*cw) + (su*sv*sw));
A.values[6] = (float) ((cu*sv*sw) - (su*cw));
A.values[8] = (float) -sv;
A.values[9] = (float) (su*cv);
A.values[10] = (float) (cu*cv);

return A;
}
*/

// Multiplies the Z * Y * X Rotation Matrices to form 'Matrix4x4f m'
Matrix4x4f m = Matrix4x4.createRotationMatrix(azimuth, elevation, tilt);

// Multiple point 'a' with Matrix4x4f 'm' to get point 'b'
m.transform(a); // Should return {2, 0, 2} same 'b', but returns {2, 0, 0}

// ~~~ End of Rotation Matrix ~~~

仅供引用。我的主要信息来源如下:

http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToMatrix/index.htm

谢谢大家

最佳答案

我可以解释一种查找旋转矩阵的算法,尽管我没有代码。

每次旋转都是围绕一个轴。我假设您想要一个穿过原点 O 的轴。在这种情况下,旋转发生在由三个点 O、A 和 B 定义的平面中。作为旋转轴,您可以使用 vector ,即两个 vector OA 和 OB 的叉积。 Here是公式。

enter image description here

为了简单起见,我们将该方向 vector 的三个分量称为轴 (u,v,w)(并且我们假设其已标准化)。接下来找到 OA 和 OB 之间的角度 theta,这是通过 standard formula 找到的。两个 vector 之间的角度。

最后,最困难的部分已在 this site 为您完成。 ,其中 links到以下绕原点旋转的 3D 矩阵,该矩阵会将 A 旋转到 B。可以在此站点下载该矩阵的 Java 代码。

enter image description here

您可以交互式地查看一些旋转 here .

关于java - 无法正确旋转 3D 点 A 到 B(在 X、Y、Z 轴上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43639649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com