通过矢量计算旋转

Calculate rotation by vector

我有一个圆心在 (0,0,0) 和半径 = 1 的球体,它的表面上有三个标记点,形成一个三角形:

x = (1,0,0)
y = (0,1,0)
z = (0,0,1)

现在,我通过向量 v_y 翻译 y 得到 y'

v_y = [1, 2, 3]
y' = (1, 3, 3)

我想计算v_x和v_z的方式,x'和z'都会以相同的方式移动,因此计算出的点将形成相似的三角形(相同的边长比)

我知道可以通过旋转和缩放这个球体来实现,但我不知道如何仅通过知道这个向量来计算它。 我需要两个角度用于旋转,一个标量用于缩放。

也许我错了,我可以只计算那些向量而不计算旋转。

如果不知道您认为自己实际应用了什么变换,以及您期望其他顶点如何移动,就不可能知道如何创建其他顶点。

基于单个原始点和单个新点,您仅描述球体方向的半径和一个轴(原点和 y' 之间的向量)。但是,具体定义精确变换所需的第二个轴的旋转是不明确的。您可以将新球体围绕原点和 y' 之间的矢量旋转 360 度,并且 360 度弧上的任何这些值都将描述 x' 和 z' 的有效值。

我想我明白你在这里想做什么。您正在将 v_y 添加到 y 以形成 y' 并且您希望 x 和 z(垂直向量)保持垂直并相对增加长度以达到现在缩放的球体的周长。

我将分两部分进行,缩放和旋转。请注意,代码中的 y2 是您的 y'。我在这里使用 glm,但您可以替换为您自己的数学库。

//compute y2
glm::vec3 y2 = y + v_y;

//compute the scale
float scale = glm::length(y2) / glm::length(y);

//compute the scaled x and z
glm::vec3 x2 = x * scale;
glm::vec3 z2 = z * scale;

//find the normal and angle and arc as a quaternion
glm::vec3 ynorm = cross(y, glm::normalize(y2));
float angle = glm::angle(y, glm::normalize(y2));
glm::quat arcQuat = glm::angleAxis(angle, ynorm);

//now rotate x2 and z2 with the above arc
x2 = glm::gtx::quaternion::rotate(arcQuat, x2);
z2 = glm::gtx::quaternion::rotate(arcQuat, z2);

//now you have your v_x and v_z
glm::vec3 v_x = x2 - x;
glm::vec3 v_z = z2 - z;

如果按比例缩放球体,x2、y2 和 z2 将形成您想要的相似三角形。