围绕原点旋转3d

Mac*_*ite 7 math 3d trigonometry rotation

我知道有很多关于3d旋转的问题已在这里得到解答,但它们似乎都处理OpenGL中的旋转矩阵和四元数(我并不关心我是否得到万向节锁定).我需要获得一个始终必须是相同距离的点的三维坐标EX:(x,y,z),我现在称之为"d",来自原点.我输入的唯一信息是鼠标在屏幕上的deltax和deltay.到目前为止,这是我尝试过的:

第一:

thetaxz+=(omousex-mouseX)/( width ); 
thetaxy+=(omousey-mouseY)/( height);
Run Code Online (Sandbox Code Playgroud)

(thetaxy是x,y轴上的弧度角和x,z轴上的thetaxz)(我限制两个角度,这样如果它们小于或等于0,则它们等于2*PI)

第二:

pointX=cos(thetaxz)*d;
pointY=sin(thetaxy)*d;
Run Code Online (Sandbox Code Playgroud)

(pointX是点的x坐标,pointY是y)

第三:

if(thetaxz)<PI){
 pointZ=sqrt(sq(d)-sq(eyeX/d)-sq(eyeY/d));
}else{
  pointZ=-sqrt(abs(sq(d)-sq(eyeX/d)-sq(eyeY/d)));
}
Run Code Online (Sandbox Code Playgroud)

(sq()是square和abs()是绝对值函数的函数)(pointZ应该是点的z坐标,除了在正z半球和负z半球之间的交叉处.它接近边缘点得到的拉伸距离总是应该在x和y处的距离,并且看似随机地约为0.1-0.2弧度的θ坐标,z坐标变为NAN或未定义)

我已经考虑了一段时间了,说实话,我很难绕过四元数和旋转矩阵的概念,但如果你能告诉我如何使用它们来生成实际坐标,我很乐意学习.如果我可以在几个轴上使用一些三角法,我仍然会更喜欢它.提前感谢您的帮助,如果您需要更多信息,请询问.

提示/最后一刻的想法:我认为这可能与影响x和y位置的z位置有关,但我不确定.

编辑:我画了一个图: 在此输入图像描述

and*_*and 7

如果你真的希望在这方面取得任何成功,你将不得不咬紧牙关,了解旋转矩阵和/或四元数旋转.可能还有其他方法可以做你想要的,但旋转矩阵和四元数旋转的使用只是因为它们被广泛理解,并且是表达和应用向量旋转的最简单方法.某人可以提出的任何其他陈述可能是对这些中的一个或两个的更复杂的重新表述.实际上,可以看出旋转是线性变换,因此可以表示为矩阵.四元数旋转只是在3D中旋转矢量的简化方法,因此具有等效的矩阵表示.

也就是说,听起来你有兴趣通过鼠标点击并以自然的方式旋转来抓取场景中的物体.如果是这种情况,您应该查看ArcBall方法(您可能需要查看许多示例).这仍然需要你知道四元数的一些东西.您还会发现,至少对线性代数基本方面的理解将会有所帮助.

更新:根据您的图表及其包含的注释,看起来您真正要做的就是将球面坐标转换为笛卡尔坐标.只要我们就符号达成一致,那就很容易了.设θ为您调用XY的角度,即X轴绕Z轴旋转的角度; 这称为方位角,将在[0,2π]弧度或[0°,360°]范围内.设φ是XY平面和矢量之间的角度; 这被称为仰角,它将在[-π/ 2,+π/ 2]或[-90°,+ 90°]的范围内,它对应于你称之为XZ角度的角度(在XZ平面绕Y轴).还有其他惯例,所以请确保您的一致.无论如何,转换只是:

x = d?cos(φ)?cos(θ)
y = d?cos(φ)?sin(θ)
z = d?sin(φ)