繁体   English   中英

围绕另一个旋转3D点

[英]Rotate a 3D- Point around another one

我的程序中有一个函数,可以将一个点(x_p,y_p,z_p)绕另一个点(x_m,y_m,z_m)旋转角度w_nx和w_ny。 新坐标存储在全局变量x_n,y_n和z_n中。 绕y轴旋转(因此更改w_nx的值-以使y-值不受损害)可以正常工作,但是当我绕x轴或z轴旋转时(更改w_ny的值)坐标不再精确。 我在我认为我的错所在的那行上发表了评论,但我无法弄清楚该代码出了什么问题。

谁能帮我?

void rotate(float x_m, float y_m, float z_m, float x_p, float y_p, float z_p, float w_nx ,float w_ny)
    {
        float z_b = z_p - z_m;
        float x_b = x_p - x_m;
        float y_b = y_p - y_m;
        float length_ = sqrt((z_b*z_b)+(x_b*x_b)+(y_b*y_b));
        float w_bx = asin(z_b/sqrt((x_b*x_b)+(z_b*z_b))) + w_nx;
        float w_by = asin(x_b/sqrt((x_b*x_b)+(y_b*y_b))) + w_ny; //<- there must be that fault
        x_n = cos(w_bx)*sin(w_by)*length_+x_m;
        z_n = sin(w_bx)*sin(w_by)*length_+z_m;
        y_n = cos(w_by)*length_+y_m;
    }

该代码几乎可以做什么:

  • 计算差异向量
  • 将向量转换为球坐标
  • 将w_nx和wn_y添加到倾斜度和方位角(请参阅术语链接)
  • 将修改后的球坐标转换回笛卡尔坐标

有两个问题:

  • 转换不正确,您的计算是针对两个倾斜向量(一个沿x轴,另一个沿y轴)
  • 即使计算正确,球形坐标的变换也不同于绕两轴旋转

因此,在这种情况下,使用矩阵和向量数学将有所帮助:

b = p - m
b = RotationMatrixAroundX(wn_x) * b
b = RotationMatrixAroundY(wn_y) * b
n = m + b

基本旋转矩阵

尝试使用向量数学。 确定旋转的顺序,首先沿x,然后沿y。

如果沿z旋转,则[z'= z]

x' = x*cos a - y*sin a;
y' = x*sin a + y*cos a;  

y轴重复相同:[y''= y']

x'' = x'*cos b - z' * sin b;
z'' = x'*sin b + z' * cos b;  

再次沿x轴旋转:[x'''= x'']

y''' = y'' * cos c - z'' * sin c
z''' = y'' * sin c + z'' * cos c

最后是围绕某个特定“点”旋转的问题:

首先从坐标中减去该点,然后应用旋转,最后将该点加回到结果中。

据我所知,这个问题与“万能锁”密切相关。 不能相对于固定的xyz坐标系测量角度w_ny,而是相对于通过应用角度w_nx旋转的坐标系。

正如kakTuZ所观察到的,您的代码将点转换为球面坐标。 这样做本质上没有错-经度和纬度可以到达地球上的所有地方。 如果不关心地球赤道平面相对于其绕太阳轨道的倾斜,我也可以。

不沿第一个w_ny旋转下一个参考轴的结果是,在赤道处彼此相距1 km的两个点在极点处彼此靠近并以90度的纬度移动,它们接触。 即使明显的目的是使它们在旋转位置之间保持1公里的距离。

如果要变换坐标系而不是仅变换点,则需要3个角度。 但是您是对的-对于变换点,两个角度就足够了。 有关详细信息,请查阅Wikipedia ...

但是,当您使用opengl时,您确实应该使用诸如glRotatef类的opengl glRotatef 这些函数将在GPU上计算-而不是在CPU上计算。 文档在这里

就像许多其他人所说的那样,您应该使用glRotatef旋转它进行渲染。 对于碰撞处理,您可以通过将其位置向量乘以堆栈顶部渲染层上的OpenGL ModelView矩阵来获得其世界空间位置。 使用glGetFloatv获取该矩阵,然后将其与您自己的矢量矩阵乘法函数相乘,或者使用可以轻松在线获得的众多矩阵之一。

但是,那会很痛苦! 相反,应考虑使用GL反馈缓冲区。 该缓冲区将仅存储将要绘制图元的点,而不是实际绘制图元,然后您可以从那里访问它们。
是一个很好的起点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM