我的球体的中心位于(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'都会以相同的方式移动,因此计算出的点将形成相似的三角形(相同的边对比)
我知道它可以通过旋转和缩放这个球来实现,但我不知道如何通过知道这个向量来计算它。 我需要两个旋转角度,一个标尺用于缩放。
也许我错了,我可以在不计算旋转的情况下计算这些向量。
答案 0 :(得分:1)
如果不知道您认为实际应用的是什么转换,那么就不可能知道如何创建其他顶点,因此您希望其他顶点如何移动。
基于单个原点和单个新点,您只需描述球体方向的半径和一个轴(原点和y'之间的矢量)。但是,对于第二轴的旋转,您需要具体定义精确的变换。您可以围绕原点和y'之间的向量将新球体旋转360度,并且360度弧上的任何值都将描述x'和z'的有效值。
答案 1 :(得分:1)
我想我得到了你想要做的事情。您正在向y添加v_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将形成您想要的类似三角形。