我试图围绕一个半径为2的点(10,6,10)旋转一个点(20,6,30),到目前为止我试图做到这一点。 我知道要围绕原点旋转一个点,你只需将旋转矩阵与世界矩阵相乘,然后围绕自身旋转一个点,将点转换为原点,然后旋转和平移,但不知道如何解决这个问题。
答案 0 :(得分:3)
如果你愿意,我可以把一些C ++代码拼凑起来(因为它被弃用而偏离D3DX),但我认为为自己搞清楚是编程的一个重要部分。这是围绕3d点v1旋转3d点v2的算法。希望它有所帮助:
1。)通过来自v1的子串v2计算差异向量。存放在v3中。
2。)将v3转换为spherical coordinates,由半径,偏航和音高定义的符号。
3。)根据需要改变theta(yaw)和phi(pitch)的值。
4。)将v3转换回笛卡尔坐标(x,y,z)并添加v1的坐标。这就是v2新职位应该在哪里。
注1 - 在物理学中,theta和phi的含义是交换的,所以θ是音高,phi是偏航。在数学中,θ是偏航,phi是俯仰。
注2 - 偏航,俯仰和滚转被描述为:
注3 - 关于D3DX的维基百科:“2012年,微软宣布D3DX将与其他开发框架(如XNA)一起在Windows 8 SDK中弃用.D3DX的数学结构,如矢量和矩阵,将被合并将XNAMath放入新库:DirectXMath。“
答案 1 :(得分:0)
如果围绕任意的原点坐标旋转对象坐标,则使用半径没有意义,因为在旋转过程中半径将保持恒定。要在旋转过程中使用所需的半径,请确保对象坐标和原点坐标相距所需的半径。 另外请注意,在使用欧拉角(相对于球面或四元数)时,需要一个旋转轴绕一个点旋转,因为否则旋转轴未定义您要旋转的方向。
如果您愿意做矩阵数学,这就是我的方法(使用伪代码,因为我只知道OGL):
vec3 translate_around_point
(
vec3 object_pos,
vec3 origin_pos,
vec3 rotation_axis,
float rotation
)
{
// get difference
vec3 difference = object_pos - origin_pos;
//rotate difference on rotation axis
mat4 model = rotate(mat4 model(1.0), rotation, rotation_axis);
vec3 trans = model * vec4(difference, 1.0);
//add add translation to origin pos
return origin_pos + trans;
}
使用此功能的代码如下(半径为22.360679626464844
):
vec3 object_pos(20.0, 6.0, 30.0);
vec3 orig_pos(10.0, 6.0, 10.0);
vec3 axis(0.0, 1.0, 0.0); // rotation axis is 'up' in world space
float angle = 90.0;
object_pos = translate_around_point(object_pos, orig_pos, axis, angle);
如果要在对象位置具有更高的高度或倾斜的旋转轴的情况下运行它,则原点位置可能不再看起来位于旋转的中心。没关系,因为如果旋转不在轴的一部分(x,y或z)上旋转,那么它将不会影响该部分的平移。